import os
import json
import subprocess
from flask import Blueprint, request, jsonify
from models.image import Image
from models.quiz_share import QuizShare
from models.qna import QnA
from models.mcq import MCQ
from utils.mcq_generator import mcq_main
from utils.qa_generator import qa_main
from utils.jwt_service import jwt_required

qna_bp = Blueprint("qna", __name__)

#PYTHON_PATH = "/home/ubuntu/myvenv/bin/python"
OUTPUT_FOLDER = os.path.join(os.getcwd(), "public/images/output_files/")
QNA_SCRIPT = os.path.join(os.getcwd(), "utils/qa_generator.py")
MCQ_SCRIPT = os.path.join(os.getcwd(), "utils/mcq_generator.py")


@qna_bp.route("/get-qna", methods=["POST"])
@jwt_required
def get_qna():
    user_id = getattr(request, "user_id", None)
    data = request.json if request.is_json else request.form
    json_file = data.get("output_file")
    req_type = data.get("type")
    shared_quiz_id = data.get("shared_quiz_id")

    # --- Validation ---
    if not shared_quiz_id:
        if not json_file:
            return jsonify({"status": False, "message": "No file path provided in the request."}), 400

        get_single_image = Image.objects(output_file=json_file).first()
        if not get_single_image:
            return jsonify({"status": False, "message": "Invalid json file."}), 400
    else:
        isShared = QuizShare.objects(
            quiz_id=shared_quiz_id,
            # user_id=request.user.id  # NOTE: you'll need auth middleware to set request.user
            user_id=user_id
        ).first()
        if not isShared:
            return jsonify({"status": False, "message": "Quiz has not been shared with this user."}), 400

        get_single_image = Image.objects(id=shared_quiz_id).first()
        if not get_single_image:
            return jsonify({"status": False, "message": "Invalid shared quiz ID, no associated output file found."}), 400

        json_file = get_single_image.output_file

    if not req_type:
        return jsonify({"status": False, "message": "Request type should be provided in the request."}), 400
    if req_type not in ["qna", "mcq"]:
        return jsonify({"status": False, "message": 'Invalid type parameter. Only "qna" or "mcq" are allowed.'}), 400

    if not os.path.exists(OUTPUT_FOLDER):
        os.makedirs(OUTPUT_FOLDER, exist_ok=True)

    question_details = []
    decoded_output = []
    msg = ""

    # --- QNA ---
    if req_type == "qna":
        msg = "Q&A generation successful."
        jsonFilePath = os.path.join(OUTPUT_FOLDER, f"QA_{get_single_image.user_id.id}_{get_single_image.id}.json")

        if not get_single_image.extracted_qna:
            qa_main(json_file, jsonFilePath)

            with open(jsonFilePath, "r") as f:
                decoded_output = json.load(f)

            for i in range(0, len(decoded_output), 2):
                if i + 1 < len(decoded_output):
                    q = decoded_output[i].strip()
                    a = decoded_output[i + 1].strip()
                    question_details.append({"question": q, "answer": a})

                    QnA(question=q, answer=a).save()

            get_single_image.update(
                qna_output_file=jsonFilePath,
                extracted_qna=decoded_output,
                other_extracted_qna=question_details
            )

        else:
            decoded_output = get_single_image.extracted_qna
            question_details = get_single_image.other_extracted_qna
            jsonFilePath = get_single_image.output_file

    # --- MCQ ---
    else:
        msg = "MCQ generation successful."
        jsonFilePath = os.path.join(OUTPUT_FOLDER, f"MCQ_{get_single_image.user_id.id}_{get_single_image.id}.json")

        if not get_single_image.extracted_mcq:
            mcq_main(json_file, jsonFilePath)

            with open(jsonFilePath, "r") as f:
                decoded_output = json.load(f)

            for i in range(0, len(decoded_output), 4):
                if i + 3 < len(decoded_output):
                    q = decoded_output[i]
                    opts = decoded_output[i + 1]
                    correct = decoded_output[i + 2]
                    expl = decoded_output[i + 3]

                    question_details.append({
                        "question": q,
                        "Options": opts,
                        "Correct Answer": correct,
                        "Explanation": expl
                    })

                    opts_list = [o.strip() for o in opts.split("\n")] if isinstance(opts, str) else []

                    MCQ(
                        output_file=json_file,
                        question=q,
                        option_a=opts_list[0] if len(opts_list) > 0 else "",
                        option_b=opts_list[1] if len(opts_list) > 1 else "",
                        option_c=opts_list[2] if len(opts_list) > 2 else "",
                        option_d=opts_list[3] if len(opts_list) > 3 else "",
                        correct_answer=correct,
                        explanation=expl,
                    ).save()

            get_single_image.update(
                mcq_output_file=jsonFilePath,
                extracted_mcq=decoded_output,
                other_extracted_mcq=question_details
            )

        else:
            decoded_output = get_single_image.extracted_mcq
            question_details = get_single_image.other_extracted_mcq
            jsonFilePath = get_single_image.output_file

    return jsonify({
        "status": True,
        "message": msg,
        "output_file": jsonFilePath,
        "output": decoded_output,
        "array_output": question_details
    }), 200