"""
Research submission routes for ScholarPress.
"""

from flask import Blueprint, render_template, request, redirect, url_for, flash, current_app
from app import db
from app.models import Submission, Journal, Tag, SiteSettings, generate_tracking_id
from app.utils import allowed_file, save_file, get_file_extension
from app.utils.email import send_submission_confirmation

submission_bp = Blueprint('submission', __name__)


@submission_bp.route('/', methods=['GET', 'POST'])
def submit():
    """Research submission form."""
    settings = SiteSettings.query.first()
    journals = Journal.query.filter_by(is_active=True).order_by(Journal.name).all()
    all_tags = Tag.query.order_by(Tag.name).all()
    
    if request.method == 'POST':
        # Get form data
        title = request.form.get('title', '').strip()
        abstract = request.form.get('abstract', '').strip()
        authors = request.form.get('authors', '').strip()
        contact_email = request.form.get('contact_email', '').strip()
        affiliation = request.form.get('affiliation', '').strip()
        orcid = request.form.get('orcid', '').strip()
        journal_id = request.form.get('journal_id', type=int)
        tag_ids = request.form.getlist('tags', type=int)
        
        # Validate required fields
        errors = []
        if not title:
            errors.append('Title is required.')
        if not abstract:
            errors.append('Abstract is required.')
        if not authors:
            errors.append('Author names are required.')
        if not contact_email:
            errors.append('Contact email is required.')
        if not journal_id:
            errors.append('Please select a journal.')
        
        # Handle file upload
        file = request.files.get('manuscript')
        if not file or file.filename == '':
            errors.append('Please upload your manuscript.')
        elif not allowed_file(file.filename):
            errors.append('Only PDF, DOCX, DOC, and TXT files are allowed.')
        
        if errors:
            for error in errors:
                flash(error, 'danger')
            return render_template('public/submit.html',
                                 settings=settings,
                                 journals=journals,
                                 all_tags=all_tags)
        
        # Save the file
        file_path = save_file(file, 'submissions')
        file_type = get_file_extension(file.filename)
        
        # Create submission
        submission = Submission(
            tracking_id=generate_tracking_id(),
            title=title,
            abstract=abstract,
            authors=authors,
            contact_email=contact_email,
            affiliation=affiliation or None,
            orcid=orcid or None,
            journal_id=journal_id,
            file_path=file_path,
            file_type=file_type,
            status='pending'
        )
        
        # Add tags
        if tag_ids:
            tags = Tag.query.filter(Tag.id.in_(tag_ids)).all()
            submission.tags = tags
        
        db.session.add(submission)
        db.session.commit()
        
        # Send confirmation email
        try:
            send_submission_confirmation(submission, current_app.config['SITE_URL'])
        except Exception as e:
            current_app.logger.error(f"Failed to send confirmation email: {e}")
        
        flash('Your submission has been received successfully!', 'success')
        return redirect(url_for('submission.confirmation', tracking_id=submission.tracking_id))
    
    return render_template('public/submit.html',
                         settings=settings,
                         journals=journals,
                         all_tags=all_tags)


@submission_bp.route('/confirmation/<tracking_id>')
def confirmation(tracking_id):
    """Submission confirmation page."""
    settings = SiteSettings.query.first()
    submission = Submission.query.filter_by(tracking_id=tracking_id).first_or_404()
    
    return render_template('public/submission_confirmation.html',
                         settings=settings,
                         submission=submission)


@submission_bp.route('/track', methods=['GET', 'POST'])
def track():
    """Track submission status."""
    settings = SiteSettings.query.first()
    submission = None
    
    tracking_id = request.args.get('tracking_id') or request.form.get('tracking_id', '').strip()
    
    if tracking_id:
        submission = Submission.query.filter_by(tracking_id=tracking_id).first()
        if not submission:
            flash('No submission found with that tracking ID.', 'warning')
    
    return render_template('public/track_submission.html',
                         settings=settings,
                         submission=submission,
                         tracking_id=tracking_id)


@submission_bp.route('/guidelines')
def guidelines():
    """Submission guidelines page."""
    settings = SiteSettings.query.first()
    journals = Journal.query.filter_by(is_active=True).order_by(Journal.name).all()
    
    return render_template('public/submission_guidelines.html',
                         settings=settings,
                         journals=journals)
