from flask import render_template, redirect, url_for, flash, request, jsonify
from app import db
from app.models.progress import Submission, Progress
from app.models.topic import Topic
from app.routes.teacher import bp
from app.utils.decorators import teacher_required
from app.services.ai_assessment import assess_submission, get_ai_assessor
from app.forms.teacher import ReviewSubmissionForm
from flask_login import login_required, current_user
import json

@bp.route('/submissions/<int:submission_id>/review', methods=['GET', 'POST'])
@login_required
@teacher_required
def review_submission(submission_id):
    # Get submission with necessary relationships
    submission = Submission.query\
        .join(Progress)\
        .join(Topic)\
        .filter(
            Topic.teacher_id == current_user.id,
            Submission.id == submission_id
        ).first_or_404()

    form = ReviewSubmissionForm()

    if request.method == 'POST':
        # Handle form data instead of JSON
        if form.validate_on_submit():
            # Get teacher score (optional)
            teacher_score_input = request.form.get('teacher_score', '').strip()
            if teacher_score_input:
                try:
                    teacher_score = float(teacher_score_input)
                    # Validate score range
                    if 0 <= teacher_score <= 100:
                        submission.teacher_score = teacher_score
                    else:
                        flash('Score must be between 0 and 100', 'error')
                        return redirect(url_for('teacher.review_submission', submission_id=submission_id))
                except ValueError:
                    flash('Invalid score format', 'error')
                    return redirect(url_for('teacher.review_submission', submission_id=submission_id))
            else:
                submission.teacher_score = None
            
            # Update submission with teacher's review
            submission.teacher_feedback = request.form.get('feedback', '').strip()
            submission.teacher_notes = request.form.get('notes', '').strip()  # Private notes
            submission.status = request.form.get('status', 'reviewed')
            submission.reviewed_by = current_user.id
            submission.reviewed_at = db.func.now()
            
            try:
                db.session.commit()
                
                # Show appropriate message
                if submission.teacher_score is not None:
                    flash(f'Review submitted with your score: {submission.teacher_score}%', 'success')
                else:
                    flash('Review submitted (AI score will be used)', 'success')
                    
                return redirect(url_for('teacher.dashboard'))
            except Exception as e:
                db.session.rollback()
                flash(f'Error submitting review: {str(e)}', 'error')
        else:
            # If form validation fails, show errors
            for field, errors in form.errors.items():
                for error in errors:
                    flash(f'{field}: {error}', 'error')

    # For GET requests, prepare the submission data
    # Parse content and feedback if they're JSON strings
    try:
        if isinstance(submission.content, str):
            submission.parsed_content = json.loads(submission.content)
        else:
            submission.parsed_content = submission.content
    except:
        submission.parsed_content = {'raw': submission.content}

    try:
        if hasattr(submission, 'feedback_json') and submission.feedback_json:
            if isinstance(submission.feedback_json, str):
                submission.parsed_feedback = json.loads(submission.feedback_json)
            else:
                submission.parsed_feedback = submission.feedback_json
        elif submission.feedback:
            submission.parsed_feedback = json.loads(submission.feedback)
        else:
            submission.parsed_feedback = []
    except:
        submission.parsed_feedback = []

    return render_template('teacher/review_submission.html', 
                         submission=submission,
                         student=submission.progress.student,
                         topic=submission.progress.topic,
                         form=form)

@bp.route('/submissions/<int:submission_id>/request-ai-review', methods=['POST'])
@login_required
@teacher_required
def request_ai_review(submission_id):
    submission = Submission.query\
        .join(Progress)\
        .join(Topic)\
        .filter(
            Topic.teacher_id == current_user.id,
            Submission.id == submission_id
        ).first_or_404()

    try:
        # Get AI assessment
        feedback = assess_submission(submission)
        
        # Format feedback into a more readable structure
        ai_assessor = get_ai_assessor()
        formatted_feedback = ai_assessor.format_feedback(feedback)
        
        return jsonify({
            'status': 'success',
            'feedback': formatted_feedback
        })
    except Exception as e:
        return jsonify({
            'status': 'error',
            'message': str(e)
        }), 500

@bp.route('/submissions/pending')
@login_required
@teacher_required
def pending_submissions():
    """View all pending submissions with student and topic details"""
    from app.models.user import User
    
    submissions = Submission.query\
        .join(Progress)\
        .join(Topic)\
        .join(User, Progress.student_id == User.id)\
        .filter(
            Topic.teacher_id == current_user.id,
            Submission.status == 'pending'
        )\
        .order_by(Submission.created_at.desc())\
        .all()

    return render_template('teacher/pending_submissions.html', 
                         submissions=submissions)