from flask import Blueprint, request, jsonify
from flask_restful import Resource, Api
from bson import ObjectId
from models.exam import Exam, StudyMaterial
from models.sub_exam import SubExam
from utils.jwt_service import jwt_required

exams_bp = Blueprint('exams', __name__)
exams_api = Api(exams_bp)

class ExamList(Resource):
    @jwt_required
    def get(self):
        exams = Exam.objects(status=1).order_by('exam_position')

        if not exams:
            return {
                "status": "false",
                "message": "No exams list available yet",
                "data": []
            }, 200

        exam_list = []
        for exam in exams:
            exam_list.append({
                "id": str(exam.id),
                "exam_title": exam.exam_title,
                "exam_description": exam.exam_description or "",
                "status": exam.status,
                "icon": exam.icon or "",
                "alloted_materials": exam.alloted_materials or "",
                "exam_position": exam.exam_position or None,
                "created_date": exam.created_date.isoformat()
            })

        return {
            "status": "true",
            "message": "Exam list fetched successfully",
            "data": exam_list
        }, 200

exams_api.add_resource(ExamList, '/exams_list')

@exams_bp.route('/get_sub_exams/<string:exam_id>', methods=['GET'])
@jwt_required
def get_sub_exams(exam_id):
    try:
        # Ensure exam_id is a valid ObjectId
        if not ObjectId.is_valid(exam_id):
            return jsonify({
                "status": "false",
                "message": "Invalid exam ID",
                "data": []
            }), 400
        
        sub_exam_list = SubExam.objects(exam_id=exam_id, status=1).order_by('position')
        if not sub_exam_list:
            return jsonify({
                "status": "false",
                "message": "No sub-exams found for this exam",
                "data": []
            }), 404

        result = []
        for sub_exam in sub_exam_list:
            result.append({
                "id": str(sub_exam.id),
                "icon": sub_exam.icon or "",
                "sub_exam_title": sub_exam.sub_exam_title,
                "sub_exam_description": sub_exam.sub_exam_description or "",
                "status": sub_exam.status,
                "position": sub_exam.position,
                "created_date": sub_exam.created_date.isoformat()
            })
        
        return jsonify({
            "status": "true",
            "message": "Sub-exams fetched successfully",
            "data": result
        }), 200
    except Exception as e:
        return jsonify({
            "status": "false",
            "message": f"An error occurred: {str(e)}",
            "data": []
        }), 500

@exams_bp.route('/get_exam_materials/<string:exam_id>', methods=['GET'])
@jwt_required
def get_exam_materials(exam_id):
    try:
        # Ensure exam_id is a valid ObjectId
        if not ObjectId.is_valid(exam_id):
            return jsonify({
                "status": "false",
                "message": "Invalid exam ID",
                "data": []
            }), 400
        
        sub_exam_list = SubExam.objects(exam_id=exam_id, status=1).order_by('position')
        if not sub_exam_list:
            return jsonify({
                "status": "false",
                "message": "No sub-exams found for this exam",
                "data": []
            }), 404
        result = []
        for sub_exam in sub_exam_list:
            result.append({
                "id": str(sub_exam.id),
                "icon": sub_exam.icon or "",
                "sub_exam_title": sub_exam.sub_exam_title,
                "sub_exam_description": sub_exam.sub_exam_description or "",
                "status": sub_exam.status,
                "position": sub_exam.position,
                "created_date": sub_exam.created_date.isoformat()
            })
        return jsonify({
            "status": "true",
            "message": "Sub-exams fetched successfully",
            "data": result
        }), 200
    except Exception as e:
        return jsonify({
            "status": "false",
            "message": f"An error occurred: {str(e)}",
            "data": []
        }), 500



        


# @exams_bp.route('/get_exam_materials/<string:exam_id>', methods=['GET'])
# #@jwt_required
# def get_exam_materials(exam_id):
#     try:
#         # Ensure exam_id is a valid ObjectId
#         if not ObjectId.is_valid(exam_id):
#             return jsonify({
#                 "status": "false",
#                 "message": "Invalid exam ID",
#                 "data": []
#             }), 400

#         exam = Exam.objects(id=exam_id, status=1).first()
        
#         if not exam:
#             return jsonify({
#                 "status": "false",
#                 "message": "Exam not found or inactive",
#                 "data": []
#             }), 404

#         material_ids = [int(mid.strip()) for mid in exam.alloted_materials.split(',') if mid.strip().isdigit()]

#         if not material_ids:
#             return jsonify({
#                 "status": "false",
#                 "message": "No valid materials assigned to this exam",
#                 "data": []
#             }), 200

#         # Step 2: Query StudyMaterial for matching titles
#         materials = StudyMaterial.objects(id__in=material_ids)
#         material_titles = [{"id": mat.id, "title": mat.material_title} for mat in materials]

#         return jsonify({
#             "status": "true",
#             "message": "Study materials fetched successfully",
#             "data": material_titles
#         }), 200

#     except Exception as e:
#         return jsonify({
#             "status": "false",
#             "message": f"An error occurred: {str(e)}",
#             "data": []
#         }), 500
