from flask import Blueprint, request, jsonify
from src.utils.response import error_response
from sqlalchemy import Select, Delete
from env import ORGANISED_FILE_PATH, QUESTION_DATA
import json
import os
from src.models import ConceptTable, SubConceptTable, QuestionTable, AvatarTable
from src import db
from src.models import SchoolTable
from src.utils.avatar import avatar_dict

admin_bp = Blueprint('admin', __name__, url_prefix='/admin')


@admin_bp.route("/bulk_add_question", methods=['POST'])
def add_ques():
    try:
        body = request.get_json()
        grade = body.get("grade")
        stream = body.get("stream")
        
        if not grade or not stream:
            return error_response("Payload required", 404)
                
        with open(ORGANISED_FILE_PATH, "r", encoding="utf-8") as f:
            org_concept = json.load(f)
            for concept, concept_val in org_concept[stream][f'grade_{grade}'].items():
                stmt_find_concept = Select(ConceptTable).where(
                    ConceptTable.name == concept,
                    ConceptTable.grade == grade,
                    ConceptTable.stream == stream.upper(),
                    ConceptTable.description == f"{concept} concept for Grade {grade} ({stream.upper()})."
                )
                db_concept = db.session.execute(stmt_find_concept).scalar_one_or_none()
                
                if not db_concept:
                    db_concept = ConceptTable(
                        name = concept,
                        grade = grade,
                        stream = stream.upper(),
                        description = f"{concept} concept for Grade {grade} ({stream.upper()})."
                    )
                    db.session.add(db_concept)
                    db.session.flush()
                
                subconcepts = concept_val.get("subconcepts")
                concept_folder = concept_val.get("folder_name")
                
                for sub_name, sub_val in subconcepts.items():
                    file_name = sub_val.get("file")
                    stmt_find_subconcept = Select(SubConceptTable).where(
                        SubConceptTable.concept_id == db_concept.id,
                        SubConceptTable.name == sub_name,
                        SubConceptTable.grade == grade,
                        SubConceptTable.stream == stream
                    )
                    db_subconcept = db.session.execute(stmt_find_subconcept).scalar_one_or_none()
                    if not db_subconcept:
                        db_subconcept = SubConceptTable(
                            concept_id = db_concept.id,
                            name = sub_name,
                            grade = grade,
                            stream = stream.upper()
                        )
                        db.session.add(db_subconcept)
                        db.session.flush()
                    full_path = os.path.join(QUESTION_DATA, stream, f'grade_{grade}', concept_folder, file_name)
                    with open(full_path, "r", encoding="utf-8") as ques_data:
                        data_file = json.load(ques_data)
                    all_ques = data_file.get("questions", [])
                    for q in all_ques:
                        new_q = QuestionTable(
                            subconcept_id=db_subconcept.id,
                            difficulty=q.get("difficulty", "easy"),
                            question=q.get("question"),
                            options=q.get("options"),
                            correct_answer=q.get("correct_answer")
                        )
                        db.session.add(new_q)
        
        db.session.commit()    
        return jsonify({
            "success": True,
            "message": "All working"
        }), 200
    except Exception as e:
        return jsonify({
            "success": False,
            "message": "Internal server error",
            "error": str(e)
        }), 500
            

@admin_bp.route("/add-school", methods=['POST'])
def add_school():
    try:
        body = request.get_json()
        school_name = body.get("school_name")
        school_id = body.get("school_id")
        
        if not school_name or not school_id:
            return error_response("payload required", 404)
        
        new_school = SchoolTable(
            school_name=school_name,
            school_id=school_id,
            stream="CBSE"
        )
        db.session.add(new_school)
        db.session.commit()

        return jsonify({
            "success": True,
            "message": "School added",
            "school name":  new_school.school_name,
            "school id": new_school.school_id
        })
    except Exception as e:
        return jsonify({
            "success": False,
            "message": "Internal server error",
            "error": str(e)
        }), 500
        

@admin_bp.route("/add_avatar")
def add_avatar():
    try:
        db.session.execute(Delete(AvatarTable))
        db.session.commit()
        for avt in avatar_dict:
            new_avt = AvatarTable(
                id=avt["id"],
                avatar=avt["avatar"],
                price=avt["price"]
            )
            db.session.add(new_avt)

        db.session.commit()

        return jsonify({
            "success": True,
            "message": "All avatars added successfully!"
        })

    except Exception as e:
        return jsonify({
            "success": False,
            "message": "Internal server error",
            "error": str(e)
        }), 500