from flask import Blueprint, render_template, redirect, url_for, flash, request
from flask_login import login_required, current_user
from app import db
from app.models.quiz import TeacherQuiz, TeacherQuestion, QuizAttempt
from app.models.user import User
from app.forms.teacher.quiz import QuizForm, QuestionForm
import json

# Use the main teacher blueprint
from app.routes.teacher import bp

@bp.route('/quizzes')
@login_required
def manage_quizzes():
    quizzes = TeacherQuiz.query.filter_by(created_by=current_user).order_by(TeacherQuiz.created_at.desc()).all()
    return render_template('teacher/quiz/manage.html', quizzes=quizzes)

@bp.route('/quizzes/add', methods=['GET', 'POST'])
@login_required
def add_quiz():
    form = QuizForm()
    if form.validate_on_submit():
        quiz = TeacherQuiz(
            title=form.title.data.strip(),
            description=form.description.data.strip() if form.description.data else None,
            quiz_type=form.quiz_type.data,
            created_by=current_user
        )
        db.session.add(quiz)
        db.session.commit()
        flash('Quiz created successfully! Now add questions.', 'success')
        return redirect(url_for('teacher.edit_quiz', quiz_id=quiz.id))
    return render_template('teacher/quiz/add.html', form=form)

@bp.route('/quizzes/edit/<int:quiz_id>', methods=['GET', 'POST'])
@login_required
def edit_quiz(quiz_id):
    quiz = TeacherQuiz.query.get_or_404(quiz_id)
    if quiz.created_by != current_user:
        flash('Access denied.', 'error')
        return redirect(url_for('teacher.manage_quizzes'))

    form = QuizForm(obj=quiz)
    questions = quiz.questions

    if request.method == 'POST':
        if 'update_quiz' in request.form:
            if form.validate_on_submit():
                quiz.title = form.title.data.strip()
                quiz.description = form.description.data.strip() if form.description.data else None
                quiz.quiz_type = form.quiz_type.data
                db.session.commit()
                flash('Quiz updated!', 'success')
                return redirect(url_for('teacher.edit_quiz', quiz_id=quiz.id))

        elif 'add_question' in request.form:
            # Handle adding a new question
            question_text = request.form.get('question_text', '').strip()
            question_type = request.form.get('question_type', '')

            if not question_text or not question_type:
                flash('Question text and type are required.', 'error')
            else:
                question = TeacherQuestion(
                    quiz_id=quiz.id,
                    question_text=question_text,
                    question_type=question_type
                )

                if question_type == 'mcq':
                    options = []
                    for i in range(1, 5):
                        opt = request.form.get(f'option{i}', '').strip()
                        if opt:
                            options.append(opt)
                    if len(options) < 2:
                        flash('MCQ questions need at least 2 options.', 'error')
                        return redirect(url_for('teacher.edit_quiz', quiz_id=quiz.id))

                    correct_option = request.form.get('correct_option', '')
                    if not correct_option or not correct_option.isdigit() or int(correct_option) < 1 or int(correct_option) > len(options):
                        flash('Please select a valid correct option.', 'error')
                        return redirect(url_for('teacher.edit_quiz', quiz_id=quiz.id))

                    question.set_options(options)
                    question.correct_answer = options[int(correct_option) - 1]

                elif question_type == 'qa':
                    expected_answer = request.form.get('expected_answer', '').strip()
                    if not expected_answer:
                        flash('Expected answer is required for Q&A questions.', 'error')
                        return redirect(url_for('teacher.edit_quiz', quiz_id=quiz.id))
                    question.expected_answer = expected_answer

                db.session.add(question)
                db.session.commit()
                flash('Question added!', 'success')

        elif 'delete_question' in request.form:
            question_id = request.form.get('question_id')
            if question_id:
                question = TeacherQuestion.query.get(int(question_id))
                if question and question.quiz_id == quiz.id:
                    db.session.delete(question)
                    db.session.commit()
                    flash('Question deleted!', 'success')

        return redirect(url_for('teacher.edit_quiz', quiz_id=quiz.id))

    return render_template('teacher/quiz/edit.html', form=form, quiz=quiz, questions=questions)

@bp.route('/quizzes/delete/<int:quiz_id>', methods=['POST'])
@login_required
def delete_quiz(quiz_id):
    quiz = TeacherQuiz.query.get_or_404(quiz_id)
    if quiz.created_by != current_user:
        flash('Access denied.', 'error')
        return redirect(url_for('teacher.manage_quizzes'))

    db.session.delete(quiz)
    db.session.commit()
    flash('Quiz deleted!', 'success')
    return redirect(url_for('teacher.manage_quizzes'))

@bp.route('/quizzes/results/<int:quiz_id>')
@login_required
def quiz_results(quiz_id):
    """Show student-wise results for a specific quiz"""
    quiz = TeacherQuiz.query.get_or_404(quiz_id)
    if quiz.created_by != current_user:
        flash('Access denied.', 'error')
        return redirect(url_for('teacher.manage_quizzes'))

    # Get all attempts for this quiz
    attempts = QuizAttempt.query.filter_by(quiz_id=quiz_id).order_by(QuizAttempt.attempted_at.desc()).all()

    # Get attempt data with student info
    results = []
    for attempt in attempts:
        results.append({
            'student': attempt.student,
            'attempt': attempt,
            'score': attempt.score,
            'total_questions': attempt.total_questions,
            'percentage': attempt.percentage,
            'attempted_at': attempt.attempted_at
        })

    return render_template('teacher/quiz/results.html', quiz=quiz, results=results)

@bp.route('/quizzes/pending/<int:quiz_id>')
@login_required
def quiz_pending(quiz_id):
    """Show students who haven't attempted a specific quiz"""
    quiz = TeacherQuiz.query.get_or_404(quiz_id)
    if quiz.created_by != current_user:
        flash('Access denied.', 'error')
        return redirect(url_for('teacher.manage_quizzes'))

    # Get all students who have attempted this quiz
    attempted_student_ids = db.session.query(QuizAttempt.student_id).filter_by(quiz_id=quiz_id).distinct().all()
    attempted_student_ids = [id[0] for id in attempted_student_ids]

    # Get all students who haven't attempted this quiz
    if attempted_student_ids:
        pending_students = User.query.filter(
            User.role == 'student',
            ~User.id.in_(attempted_student_ids)
        ).order_by(User.username).all()
    else:
        pending_students = User.query.filter(User.role == 'student').order_by(User.username).all()

    return render_template('teacher/quiz/pending.html', quiz=quiz, pending_students=pending_students)