import os
import logging
import smtplib
from email.message import EmailMessage
from dotenv import load_dotenv
from flask import Flask, render_template, redirect, url_for, flash, request
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequired, Email, Length, Optional
from premailer import transform

load_dotenv()

app = Flask(__name__)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'dev-secret-change-this')

logging.basicConfig(level=logging.DEBUG)
app.logger.setLevel(logging.DEBUG)

class ContactForm(FlaskForm):
    name = StringField('IME/PREZIME', validators=[DataRequired(), Length(max=100)])
    email = StringField('EMAIL', validators=[DataRequired(), Email(), Length(max=120)])
    phone = StringField('BROJ TELEFONA', validators=[Optional(), Length(max=30)])
    message = TextAreaField('PORUKA', validators=[DataRequired(), Length(max=2000)])
    submit = SubmitField('POŠALJI')

def send_email(name: str, sender_email: str, phone: str, message_body: str):
    host = os.environ.get('SMTP_HOST')
    port = int(os.environ.get('SMTP_PORT', 587))
    user = os.environ.get('SMTP_USER')
    password = os.environ.get('SMTP_PASSWORD')
    recipient = os.environ.get('MAIL_TO')

    if not all([host, port, user, password, recipient]):
        raise RuntimeError('SMTP konfiguracija nije potpuna. Provjeri .env.')

    # 1. Obavijest za vas (admina)
    msg_admin = EmailMessage()
    msg_admin['Subject'] = f'Upit sa weba: {name}'
    msg_admin['From'] = user
    msg_admin['To'] = recipient
    msg_admin['Reply-To'] = sender_email

    plain_admin = f"Novi upit s weba!\n\nIme: {name}\nEmail: {sender_email}\nTelefon: {phone or 'Nije naveden'}\n\nPoruka:\n{message_body}"
    msg_admin.set_content(plain_admin)

    # Putanja ažurirana na podmapu emails/
    raw_admin_html = render_template('emails/email_admin.html', name=name, sender_email=sender_email, phone=phone, message_body=message_body)
    html_admin_content = transform(raw_admin_html)
    msg_admin.add_alternative(html_admin_content, subtype='html')

    # 2. Automatska potvrda klijentu
    msg_client = EmailMessage()
    msg_client['Subject'] = 'Zaprimljen upit — Ivan Prpić Photography'
    msg_client['From'] = user
    msg_client['To'] = sender_email

    plain_client = (
        f"Poštovani/a {name},\n\n"
        "Hvala vam na javljanju!\n"
        "Vaš upit je uspješno zaprimljen. Pregledat ću detalje i javiti vam se u najkraćem mogućem roku.\n\n"
        "Lijep pozdrav,\n"
        "Ivan Prpić"
    )
    msg_client.set_content(plain_client)

    # Putanja ažurirana na podmapu emails/
    raw_client_html = render_template('emails/email_confirmation.html', name=name, message_body=message_body)
    html_client_content = transform(raw_client_html)
    msg_client.add_alternative(html_client_content, subtype='html')

    with smtplib.SMTP(host, port, timeout=30) as smtp:
        smtp.starttls()
        smtp.login(user, password)
        smtp.send_message(msg_admin)
        smtp.send_message(msg_client)

@app.route('/health')
def health():
    return 'ok', 200

@app.route('/')
def landing():
    landing_dir = os.path.join(app.static_folder, 'images', 'landing-gallery')
    exts = {'.jpg', '.jpeg', '.png', '.webp', '.gif'}
    images = []
    try:
        for fname in sorted(os.listdir(landing_dir)):
            _, ext = os.path.splitext(fname.lower())
            if ext in exts:
                images.append(f'images/landing-gallery/{fname}')
    except FileNotFoundError:
        images = []
    return render_template('index.html', images=images)

@app.route('/gallery')
def gallery():
    gallery_dir = os.path.join(app.static_folder, 'images', 'gallery')
    exts = {'.jpg', '.jpeg', '.png', '.webp', '.gif'}
    images = []
    try:
        for fname in sorted(os.listdir(gallery_dir)):
            _, ext = os.path.splitext(fname.lower())
            if ext in exts:
                images.append(f'images/gallery/{fname}')
    except FileNotFoundError:
        images = []
    return render_template('gallery.html', images=images)

@app.route('/pricing')
@app.route('/cjenik')
def pricing():
    return render_template('pricing.html')

@app.route('/about')
@app.route('/o-meni')
def about_me():
    return render_template('about.html')

@app.route('/contact', methods=['GET', 'POST'])
def contact():
    form = ContactForm()

    if form.validate_on_submit():
        try:
            send_email(form.name.data, form.email.data, form.phone.data, form.message.data)
            flash('Vaš upit je uspješno poslan! Javit ćemo vam se u najkraćem mogućem roku.', 'success')
            return redirect(url_for('contact'))
        except Exception as e:
            app.logger.exception('Greška pri slanju maila: %s', e)
            flash('Došlo je do greške pri slanju poruke.', 'error')

    return render_template('contact.html', form=form)

@app.errorhandler(Exception)
def handle_exception(e):
    app.logger.exception('Unhandled exception: %s', e)
    return "Internal Server Error", 500

if __name__ == '__main__':
    app.run(debug=True, host='127.0.0.1', port=5000)