"""
Contact message routes for ScholarPress.
"""

from flask import Blueprint, render_template, request, redirect, url_for, flash, current_app, session
from app import db
from app.models import ContactThread, ContactMessage, SiteSettings, generate_secure_token
from app.utils.email import send_contact_confirmation

contact_bp = Blueprint('contact', __name__)


@contact_bp.route('/', methods=['GET', 'POST'])
def contact():
    """Contact form page."""
    settings = SiteSettings.query.first()
    
    if request.method == 'POST':
        name = request.form.get('name', '').strip()
        email = request.form.get('email', '').strip()
        subject = request.form.get('subject', '').strip()
        message = request.form.get('message', '').strip()
        
        # Validate required fields
        errors = []
        if not name:
            errors.append('Name is required.')
        if not email:
            errors.append('Email is required.')
        if not subject:
            errors.append('Subject is required.')
        if not message:
            errors.append('Message is required.')
        
        if errors:
            for error in errors:
                flash(error, 'danger')
            return render_template('public/contact.html', settings=settings)
        
        # Create contact thread
        thread = ContactThread(
            secure_token=generate_secure_token(),
            name=name,
            email=email,
            subject=subject
        )
        db.session.add(thread)
        db.session.flush()  # Get the thread ID
        
        # Create the initial message
        contact_message = ContactMessage(
            thread_id=thread.id,
            message=message,
            is_from_user=True
        )
        db.session.add(contact_message)
        db.session.commit()
        
        # Send confirmation email with conversation link
        try:
            send_contact_confirmation(thread, current_app.config['SITE_URL'])
        except Exception as e:
            current_app.logger.error(f"Failed to send contact confirmation email: {e}")
        
        flash('Your message has been sent successfully! Check your email for the conversation link.', 'success')
        session['contact_thread_id'] = thread.id
        return redirect(url_for('contact.success'))
    
    return render_template('public/contact.html', settings=settings)


@contact_bp.route('/success')
def success():
    """Contact form success page."""
    settings = SiteSettings.query.first()
    thread = None
    thread_id = session.pop('contact_thread_id', None)
    if thread_id:
        thread = ContactThread.query.get(thread_id)
    return render_template('public/contact_success.html', settings=settings, thread=thread)


@contact_bp.route('/thread/<token>', methods=['GET', 'POST'])
def view_thread(token):
    """View and continue a contact conversation using the secure token."""
    settings = SiteSettings.query.first()
    thread = ContactThread.query.filter_by(secure_token=token).first_or_404()
    
    if request.method == 'POST':
        if thread.is_closed:
            flash('This conversation has been closed and cannot receive new messages.', 'warning')
            return redirect(url_for('contact.view_thread', token=token))
        
        message_text = request.form.get('message', '').strip()
        
        if not message_text:
            flash('Message cannot be empty.', 'danger')
            return redirect(url_for('contact.view_thread', token=token))
        
        # Create user reply
        message = ContactMessage(
            thread_id=thread.id,
            message=message_text,
            is_from_user=True
        )
        db.session.add(message)
        thread.updated_at = db.func.now()
        db.session.commit()
        
        flash('Your reply has been sent.', 'success')
        return redirect(url_for('contact.view_thread', token=token))
    
    messages = thread.messages.all()
    
    return render_template('public/contact_thread.html',
                         settings=settings,
                         thread=thread,
                         messages=messages)
