from rest_framework import serializers
from people.models import Teacher, Student
from people.models import Teacher, Student, StudentParent, Parent
from attendance.models import (
    AttendanceSession,
    StudentAttendance,
    AttendanceSummary,
    AttendanceLeave,
)
from academics.models import (
    AcademicClass,
    Standard,
    Section,
    AcademicYear,
    SubjectTeacher,
    Subject,
)
from schedules.models import TimeTable, WeekDay
from tasks.models import (
    TaskType,
    ClassTask,
    TaskItem,
    StudentTask,
    StudentTaskItem,
    TaskSubmission,
    StudentTaskSubmission,
    SpecificStudentTask,
    SpecificStudentTaskAssignment,
    SpecificStudentTaskItem,
    StudentEnrollment,
)


# =====================================================
# AUTHENTICATION SERIALIZERS
# =====================================================


class TeacherLoginSerializer(serializers.Serializer):
    """Serializer for teacher login using email"""

    email = serializers.EmailField(required=True)


class VerifyTeacherOTPSerializer(serializers.Serializer):
    """Serializer for OTP verification"""

    email = serializers.EmailField(required=True)
    otp = serializers.CharField(required=True, max_length=6)


# =====================================================
# TEACHER PROFILE SERIALIZER
# =====================================================


class TeacherProfileSerializer(serializers.ModelSerializer):
    """Complete teacher profile serializer"""

    full_name = serializers.SerializerMethodField()

    class Meta:
        model = Teacher
        fields = [
            "id",
            "external_user_id",
            "employee_id",
            "first_name",
            "middle_name",
            "last_name",
            "full_name",
            "email",
            "phone",
            "alternate_phone",
            "qualification",
            "specialization",
            "date_of_joining",
            "employment_type",
            "address_line_1",
            "address_line_2",
            "city",
            "state",
            "country",
            "pincode",
            "date_of_birth",
            "gender",
            "emergency_contact_name",
            "emergency_contact_phone",
            "emergency_contact_relation",
            "profile_image",
            "is_active",
        ]
        read_only_fields = ["id", "external_user_id", "employee_id"]

    def get_full_name(self, obj):
        return obj.full_name


# =====================================================
# ACADEMICS SERIALIZERS FOR TEACHER
# =====================================================


class StandardSerializer(serializers.ModelSerializer):
    class Meta:
        model = Standard
        fields = ["id", "name", "code", "standard_type"]


class SectionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Section
        fields = ["id", "name", "code"]


class AcademicYearSerializer(serializers.ModelSerializer):
    class Meta:
        model = AcademicYear
        fields = ["id", "name", "code", "start_date", "end_date", "is_active"]


class SubjectSerializer(serializers.ModelSerializer):
    standard_name = serializers.CharField(source="standard.name", read_only=True)
    category_name = serializers.CharField(source="category.name", read_only=True)

    class Meta:
        model = Subject
        fields = [
            "id",
            "name",
            "code",
            "subject_type",
            "standard_name",
            "category_name",
        ]


class ClassTeacherClassSerializer(serializers.ModelSerializer):
    """Serializer for class where teacher is class teacher"""

    standard = StandardSerializer(read_only=True)
    section = SectionSerializer(read_only=True)
    academic_year = AcademicYearSerializer(read_only=True)
    class_name = serializers.SerializerMethodField()

    class Meta:
        model = AcademicClass
        fields = [
            "id",
            "class_name",
            "standard",
            "section",
            "academic_year",
            "room_number",
            "current_strength",
            "max_strength",
            "boys_count",
            "girls_count",
            "is_active",
        ]

    def get_class_name(self, obj):
        return str(obj)


class SubjectTeacherInfoSerializer(serializers.ModelSerializer):
    """Serializer for subjects taught by teacher"""

    subject = SubjectSerializer(read_only=True)
    academic_class = ClassTeacherClassSerializer(read_only=True)

    class Meta:
        model = SubjectTeacher
        fields = [
            "id",
            "subject",
            "academic_class",
            "is_active",
        ]


# =====================================================
# TIMETABLE SERIALIZERS
# =====================================================


class WeekDaySerializer(serializers.ModelSerializer):
    class Meta:
        model = WeekDay
        fields = ["id", "day_code", "day_name", "is_open", "start_time", "end_time"]


class TodayTimetableSerializer(serializers.ModelSerializer):
    """Serializer for today's class schedule"""

    subject_name = serializers.CharField(source="subject.name", read_only=True)
    subject_code = serializers.CharField(source="subject.code", read_only=True)
    subject_type = serializers.CharField(source="subject.subject_type", read_only=True)
    class_name = serializers.SerializerMethodField()
    class_standard = serializers.CharField(
        source="academic_class.standard.name", read_only=True
    )
    class_section = serializers.CharField(
        source="academic_class.section.name", read_only=True
    )
    room_number = serializers.CharField()
    weekday_info = WeekDaySerializer(source="weekday", read_only=True)

    class Meta:
        model = TimeTable
        fields = [
            "id",
            "period_number",
            "start_time",
            "end_time",
            "subject_name",
            "subject_code",
            "subject_type",
            "class_name",
            "class_standard",
            "class_section",
            "room_number",
            "is_break",
            "is_substitution",
            "notes",
            "weekday_info",
        ]

    def get_class_name(self, obj):
        return str(obj.academic_class) if obj.academic_class else None


# =====================================================
# MAIN TEACHER DETAIL RESPONSE SERIALIZER
# =====================================================


class TeacherDetailResponseSerializer(serializers.Serializer):
    """Complete teacher detail response with profile, class, subjects, and today's schedule"""

    teacher_profile = TeacherProfileSerializer()
    class_teacher_info = ClassTeacherClassSerializer(allow_null=True)
    subjects_teaching = SubjectTeacherInfoSerializer(many=True)
    today_schedule = serializers.ListField(
        child=TodayTimetableSerializer(), allow_empty=True
    )
    schedule_summary = serializers.DictField()


# =====================================================
# TASK MANAGEMENT SERIALIZERS
# =====================================================


class TaskTypeSerializer(serializers.ModelSerializer):
    """Serializer for TaskType - read only for teachers"""

    class Meta:
        model = TaskType
        fields = ["id", "name", "code", "description", "is_active"]
        read_only_fields = ["id", "name", "code", "description", "is_active"]


class TeacherClassSerializer(serializers.ModelSerializer):
    """Serializer for classes teacher teaches (for dropdown)"""

    class_name = serializers.SerializerMethodField()

    class Meta:
        model = AcademicClass
        fields = ["id", "class_name"]

    def get_class_name(self, obj):
        standard = obj.standard.name if obj.standard else ""
        section = obj.section.name if obj.section else ""
        return f"{standard} - {section}".strip(" -")


class TeacherSubjectSerializer(serializers.ModelSerializer):
    """Serializer for subjects teacher teaches"""

    subject_name = serializers.CharField(source="subject.name")
    subject_id = serializers.IntegerField(source="subject.id")
    class_name = serializers.SerializerMethodField()

    class Meta:
        model = SubjectTeacher
        fields = ["id", "subject_id", "subject_name", "academic_class_id", "class_name"]

    def get_class_name(self, obj):
        standard = (
            obj.academic_class.standard.name if obj.academic_class.standard else ""
        )
        section = obj.academic_class.section.name if obj.academic_class.section else ""
        return f"{standard} - {section}".strip(" -")


class ClassTaskSerializer(serializers.ModelSerializer):
    """Serializer for creating/listing class tasks"""

    class_name = serializers.SerializerMethodField(read_only=True)
    subject_name = serializers.CharField(source="subject.name", read_only=True)
    task_type_name = serializers.CharField(source="task_type.name", read_only=True)
    posted_by_name = serializers.SerializerMethodField(read_only=True)
    total_questions = serializers.IntegerField(read_only=True, required=False)
    total_submissions = serializers.IntegerField(read_only=True, required=False)

    class Meta:
        model = ClassTask
        fields = [
            "id",
            "academic_class",
            "class_name",
            "subject",
            "subject_name",
            "task_type",
            "task_type_name",
            "title",
            "description",
            "document",
            "due_date",
            "total_marks",
            "is_published",
            "is_active",
            "posted_by",
            "posted_by_name",
            "total_questions",
            "total_submissions",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]

    def get_class_name(self, obj):
        standard = (
            obj.academic_class.standard.name if obj.academic_class.standard else ""
        )
        section = obj.academic_class.section.name if obj.academic_class.section else ""
        return f"{standard} - {section}".strip(" -")

    def get_posted_by_name(self, obj):
        if obj.posted_by:
            return f"{obj.posted_by.first_name} {obj.posted_by.last_name}".strip()
        return None


class TaskItemSerializer(serializers.ModelSerializer):
    """Serializer for task items/questions"""

    attachment_url = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = TaskItem
        fields = [
            "id",
            "class_task",
            "question_text",
            "attachment",
            "attachment_url",
            "marks",
            "order",
            "is_active",
            "created_at",
        ]
        read_only_fields = ["id", "created_at"]
        extra_kwargs = {"attachment": {"required": False, "allow_null": True}}

    def get_attachment_url(self, obj):
        if obj.attachment:
            return obj.attachment.url
        return None

    def validate(self, data):
        # Validate marks if provided
        if "marks" in data and data["marks"] is not None and data["marks"] < 0:
            raise serializers.ValidationError({"marks": "Marks cannot be negative"})

        # Validate order if provided
        if "order" in data and data["order"] < 1:
            raise serializers.ValidationError({"order": "Order must be at least 1"})

        return data


class ClassTaskDetailSerializer(serializers.ModelSerializer):
    """Detailed serializer for class task with items"""

    task_items = TaskItemSerializer(many=True, read_only=True)
    class_name = serializers.SerializerMethodField()
    subject_name = serializers.CharField(source="subject.name", read_only=True)
    task_type_name = serializers.CharField(source="task_type.name", read_only=True)
    posted_by_name = serializers.SerializerMethodField()

    class Meta:
        model = ClassTask
        fields = [
            "id",
            "academic_class",
            "class_name",
            "subject",
            "subject_name",
            "task_type",
            "task_type_name",
            "title",
            "description",
            "document",
            "due_date",
            "total_marks",
            "is_published",
            "is_active",
            "posted_by",
            "posted_by_name",
            "task_items",
            "created_at",
            "updated_at",
        ]

    def get_class_name(self, obj):
        standard = (
            obj.academic_class.standard.name if obj.academic_class.standard else ""
        )
        section = obj.academic_class.section.name if obj.academic_class.section else ""
        return f"{standard} - {section}".strip(" -")

    def get_posted_by_name(self, obj):
        if obj.posted_by:
            return f"{obj.posted_by.first_name} {obj.posted_by.last_name}".strip()
        return None


# =====================================================
# TASK SUBMISSION SERIALIZERS
# =====================================================


class TaskSubmissionSerializer(serializers.ModelSerializer):
    """Serializer for task submissions"""

    student_name = serializers.SerializerMethodField()
    student_id = serializers.IntegerField(
        source="enrollment.student.id", read_only=True
    )
    roll_number = serializers.CharField(source="enrollment.roll_number", read_only=True)
    checked_by_name = serializers.SerializerMethodField()

    class Meta:
        model = TaskSubmission
        fields = [
            "id",
            "task",
            "enrollment",
            "student_id",
            "student_name",
            "roll_number",
            "submitted_at",
            "submission_delay_days",
            "marks_obtained",
            "checked_by",
            "checked_by_name",
            "checked_at",
            "status",
            "remarks",
            "is_active",
            "created_at",
        ]
        read_only_fields = ["id", "created_at"]

    def get_student_name(self, obj):
        if obj.enrollment and obj.enrollment.student:
            return (
                obj.enrollment.student.full_name
                or f"{obj.enrollment.student.first_name} {obj.enrollment.student.last_name}".strip()
            )
        return None

    def get_checked_by_name(self, obj):
        if obj.checked_by:
            return f"{obj.checked_by.first_name} {obj.checked_by.last_name}".strip()
        return None


class StudentTaskItemAnswerSerializer(serializers.ModelSerializer):
    """Serializer for student answers to task items"""

    question_text = serializers.CharField(
        source="task_item.question_text", read_only=True
    )
    question_order = serializers.IntegerField(source="task_item.order", read_only=True)
    max_marks = serializers.IntegerField(source="task_item.marks", read_only=True)

    class Meta:
        model = StudentTaskItem
        fields = [
            "id",
            "task_item",
            "question_text",
            "question_order",
            "max_marks",
            "answer_text",
            "answer_file",
            "marks_obtained",
            "teacher_remark",
            "submitted_at",
            "created_at",
        ]
        read_only_fields = ["id", "created_at"]


class SubmissionDetailSerializer(serializers.ModelSerializer):
    """Detailed serializer for submission with answers"""

    student_name = serializers.SerializerMethodField()
    student_id = serializers.IntegerField(
        source="enrollment.student.id", read_only=True
    )
    roll_number = serializers.CharField(source="enrollment.roll_number", read_only=True)
    task_title = serializers.CharField(source="task.title", read_only=True)
    total_marks = serializers.IntegerField(source="task.total_marks", read_only=True)
    checked_by_name = serializers.SerializerMethodField()
    answers = serializers.SerializerMethodField()

    class Meta:
        model = TaskSubmission
        fields = [
            "id",
            "task",
            "task_title",
            "total_marks",
            "enrollment",
            "student_id",
            "student_name",
            "roll_number",
            "status",
            "submitted_at",
            "submission_delay_days",
            "marks_obtained",
            "checked_by",
            "checked_by_name",
            "checked_at",
            "remarks",
            "answers",
            "created_at",
        ]

    def get_student_name(self, obj):
        if obj.enrollment and obj.enrollment.student:
            return (
                obj.enrollment.student.full_name
                or f"{obj.enrollment.student.first_name} {obj.enrollment.student.last_name}".strip()
            )
        return None

    def get_checked_by_name(self, obj):
        if obj.checked_by:
            return f"{obj.checked_by.first_name} {obj.checked_by.last_name}".strip()
        return None

    def get_answers(self, obj):
        # Get student task for this submission
        student_task = StudentTask.objects.filter(
            class_task=obj.task, enrollment=obj.enrollment, is_active=True
        ).first()

        if not student_task:
            return []

        # Get answers for each question
        answers = (
            StudentTaskItem.objects.filter(student_task=student_task, is_active=True)
            .select_related("task_item")
            .order_by("task_item__order")
        )

        return StudentTaskItemAnswerSerializer(answers, many=True).data


class GradeSubmissionSerializer(serializers.Serializer):
    """Serializer for grading a submission"""

    marks_obtained = serializers.DecimalField(
        max_digits=5, decimal_places=2, required=False, allow_null=True
    )
    remarks = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    question_marks = serializers.ListField(
        child=serializers.DictField(), required=False, default=[]
    )

    def validate_marks_obtained(self, value):
        if value is not None and value < 0:
            raise serializers.ValidationError("Marks obtained cannot be negative")
        return value


class BulkGradeItemSerializer(serializers.Serializer):
    """Serializer for bulk grading item"""

    submission_id = serializers.IntegerField(required=True)
    marks_obtained = serializers.DecimalField(
        max_digits=5, decimal_places=2, required=True
    )
    remarks = serializers.CharField(required=False, allow_blank=True, allow_null=True)


class BulkGradeSerializer(serializers.Serializer):
    """Serializer for bulk grading"""

    grades = BulkGradeItemSerializer(many=True, required=True)


# =====================================================
# STUDENT TASK SERIALIZERS (kept for backward compatibility)
# =====================================================


class StudentTaskListSerializer(serializers.ModelSerializer):
    """Serializer for listing student tasks (for teacher view)"""

    student_name = serializers.SerializerMethodField()
    task_title = serializers.CharField(source="class_task.title")
    enrollment_number = serializers.CharField(
        source="enrollment.enrollment_number", read_only=True
    )
    roll_number = serializers.CharField(source="enrollment.roll_number", read_only=True)

    class Meta:
        model = StudentTask
        fields = [
            "id",
            "student",
            "student_name",
            "enrollment",
            "enrollment_number",
            "roll_number",
            "status",
            "total_marks_obtained",
            "submitted_at",
            "graded_at",
            "teacher_remark",
            "task_title",
        ]

    def get_student_name(self, obj):
        return (
            obj.student.full_name
            or f"{obj.student.first_name} {obj.student.last_name}".strip()
        )


class StudentTaskDetailSerializer(serializers.ModelSerializer):
    """Detailed serializer for student task with answers"""

    student_name = serializers.SerializerMethodField()
    task_title = serializers.CharField(source="class_task.title")
    task_description = serializers.CharField(source="class_task.description")
    total_marks = serializers.IntegerField(source="class_task.total_marks")
    due_date = serializers.DateField(source="class_task.due_date")
    answers = serializers.SerializerMethodField()

    class Meta:
        model = StudentTask
        fields = [
            "id",
            "student",
            "student_name",
            "task_title",
            "task_description",
            "total_marks",
            "due_date",
            "status",
            "total_marks_obtained",
            "submitted_at",
            "graded_at",
            "teacher_remark",
            "answers",
        ]

    def get_student_name(self, obj):
        return (
            obj.student.full_name
            or f"{obj.student.first_name} {obj.student.last_name}".strip()
        )

    def get_answers(self, obj):
        answers = (
            obj.answers.select_related("task_item").all().order_by("task_item__order")
        )
        return [
            {
                "question_id": ans.task_item.id,
                "question_text": ans.task_item.question_text,
                "question_order": ans.task_item.order,
                "max_marks": ans.task_item.marks,
                "answer_text": ans.answer_text,
                "answer_file": ans.answer_file.url if ans.answer_file else None,
                "marks_obtained": ans.marks_obtained,
                "teacher_remark": ans.teacher_remark,
                "submitted_at": ans.submitted_at,
            }
            for ans in answers
        ]


class GradeStudentTaskSerializer(serializers.Serializer):
    """Serializer for grading a student task (legacy)"""

    marks_obtained = serializers.DecimalField(
        max_digits=5, decimal_places=2, required=True
    )
    teacher_remark = serializers.CharField(required=False, allow_blank=True)


class TaskSubmissionListSerializer(serializers.ModelSerializer):
    """Serializer for teachers to list all submissions for a task"""

    student_name = serializers.SerializerMethodField()
    student_id = serializers.IntegerField(source="enrollment.student.id")
    roll_number = serializers.CharField(source="enrollment.roll_number", read_only=True)

    class Meta:
        model = TaskSubmission
        fields = [
            "id",
            "task",
            "enrollment",
            "student_id",
            "student_name",
            "roll_number",
            "submitted_at",
            "submission_delay_days",
            "marks_obtained",
            "checked_by",
            "checked_at",
            "status",
            "remarks",
            "is_active",
        ]

    def get_student_name(self, obj):
        if obj.enrollment and obj.enrollment.student:
            return (
                obj.enrollment.student.full_name
                or f"{obj.enrollment.student.first_name} {obj.enrollment.student.last_name}".strip()
            )
        return None


class TaskSubmissionDetailSerializer(serializers.ModelSerializer):
    """Detailed serializer for teachers to view a submission with answers"""

    student_name = serializers.SerializerMethodField()
    student_id = serializers.IntegerField(source="enrollment.student.id")
    roll_number = serializers.CharField(source="enrollment.roll_number", read_only=True)
    task_title = serializers.CharField(source="task.title")
    task_description = serializers.CharField(source="task.description")
    total_marks = serializers.IntegerField(source="task.total_marks")
    subject_name = serializers.CharField(source="task.subject.name", read_only=True)
    due_date = serializers.DateField(source="task.due_date")
    checked_by_name = serializers.SerializerMethodField()
    answers = serializers.SerializerMethodField()

    class Meta:
        model = TaskSubmission
        fields = [
            "id",
            "task",
            "task_title",
            "task_description",
            "subject_name",
            "total_marks",
            "due_date",
            "enrollment",
            "student_id",
            "student_name",
            "roll_number",
            "submitted_at",
            "submission_delay_days",
            "marks_obtained",
            "checked_by",
            "checked_by_name",
            "checked_at",
            "status",
            "remarks",
            "answers",
        ]

    def get_student_name(self, obj):
        if obj.enrollment and obj.enrollment.student:
            return (
                obj.enrollment.student.full_name
                or f"{obj.enrollment.student.first_name} {obj.enrollment.student.last_name}".strip()
            )
        return None

    def get_checked_by_name(self, obj):
        if obj.checked_by:
            return f"{obj.checked_by.first_name} {obj.checked_by.last_name}".strip()
        return None

    def get_answers(self, obj):
        """Get student's answers with question details"""
        # Get student task for this submission
        student_task = StudentTask.objects.filter(
            class_task=obj.task, enrollment=obj.enrollment, is_active=True
        ).first()

        if not student_task:
            return []

        # Get answers with question details
        answers = (
            StudentTaskItem.objects.filter(student_task=student_task, is_active=True)
            .select_related("task_item")
            .order_by("task_item__order")
        )

        return [
            {
                "question_id": ans.task_item.id,
                "question_text": ans.task_item.question_text,
                "question_order": ans.task_item.order,
                "max_marks": ans.task_item.marks,
                "answer_text": ans.answer_text,
                "answer_file": ans.answer_file.url if ans.answer_file else None,
                "marks_obtained": ans.marks_obtained,
                "teacher_remark": ans.teacher_remark,
            }
            for ans in answers
        ]


class BulkGradeSubmissionItemSerializer(serializers.Serializer):
    """Serializer for bulk grading submission item"""

    submission_id = serializers.IntegerField(required=True)
    marks_obtained = serializers.DecimalField(
        max_digits=5, decimal_places=2, required=True
    )
    remarks = serializers.CharField(required=False, allow_blank=True, allow_null=True)


class BulkGradeSubmissionSerializer(serializers.Serializer):
    """Serializer for bulk grading submissions"""

    grades = BulkGradeSubmissionItemSerializer(many=True, required=True)


class StudentBasicInfoSerializer(serializers.ModelSerializer):
    """Basic student info for nested display"""

    full_name = serializers.SerializerMethodField()

    class Meta:
        model = Student
        fields = ["id", "first_name", "last_name", "full_name", "admission_number"]

    def get_full_name(self, obj):
        return obj.full_name or f"{obj.first_name} {obj.last_name}".strip()


class TeacherBasicInfoSerializer(serializers.ModelSerializer):
    """Basic teacher info for nested display"""

    full_name = serializers.SerializerMethodField()

    class Meta:
        model = Teacher
        fields = ["id", "first_name", "last_name", "full_name", "employee_id"]

    def get_full_name(self, obj):
        return obj.full_name or f"{obj.first_name} {obj.last_name}".strip()


class AcademicClassBasicSerializer(serializers.ModelSerializer):
    """Basic class info for nested display"""

    class_name = serializers.SerializerMethodField()

    class Meta:
        model = AcademicClass
        fields = ["id", "class_name", "standard", "section"]

    def get_class_name(self, obj):
        return str(obj)


class SpecificStudentTaskItemSerializer(serializers.ModelSerializer):
    """Serializer for task items/questions"""

    class Meta:
        model = SpecificStudentTaskItem
        fields = [
            "id",
            "question_text",
            "attachment",
            "marks",
            "order",
            "is_active",
            "created_at",
        ]
        read_only_fields = ["id", "created_at"]


class SpecificStudentTaskAssignmentSerializer(serializers.ModelSerializer):
    """Serializer for task assignments to students"""

    student_info = StudentBasicInfoSerializer(source="student", read_only=True)
    class_info = AcademicClassBasicSerializer(source="academic_class", read_only=True)

    class Meta:
        model = SpecificStudentTaskAssignment
        fields = [
            "id",
            "student",
            "student_info",
            "enrollment",
            "academic_class",
            "class_info",
            "status",
            "assigned_at",
            "is_active",
        ]
        read_only_fields = ["id", "assigned_at"]


class SpecificStudentTaskSerializer(serializers.ModelSerializer):
    """Main serializer for SpecificStudentTask list view"""

    created_by_info = TeacherBasicInfoSerializer(source="created_by", read_only=True)
    subject_name = serializers.CharField(
        source="subject.name", read_only=True, default=None
    )
    total_questions = serializers.IntegerField(read_only=True, default=0)
    assigned_students = serializers.IntegerField(read_only=True, default=0)
    submitted_count = serializers.IntegerField(read_only=True, default=0)
    graded_count = serializers.IntegerField(read_only=True, default=0)

    class Meta:
        model = SpecificStudentTask
        fields = [
            "id",
            "created_by",
            "created_by_info",
            "subject",
            "subject_name",
            "title",
            "description",
            "document",
            "due_date",
            "total_marks",
            "total_questions",
            "assigned_students",
            "submitted_count",
            "graded_count",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]


class SpecificStudentTaskDetailSerializer(serializers.ModelSerializer):
    """Detailed serializer for SpecificStudentTask with all nested data"""

    created_by_info = TeacherBasicInfoSerializer(source="created_by", read_only=True)
    subject_name = serializers.CharField(
        source="subject.name", read_only=True, default=None
    )
    task_items = SpecificStudentTaskItemSerializer(many=True, read_only=True)
    assignments = SpecificStudentTaskAssignmentSerializer(many=True, read_only=True)

    # Statistics
    total_questions = serializers.SerializerMethodField()
    total_assigned = serializers.SerializerMethodField()
    total_submitted = serializers.SerializerMethodField()
    total_graded = serializers.SerializerMethodField()

    class Meta:
        model = SpecificStudentTask
        fields = [
            "id",
            "created_by",
            "created_by_info",
            "subject",
            "subject_name",
            "title",
            "description",
            "document",
            "due_date",
            "total_marks",
            "task_items",
            "assignments",
            "total_questions",
            "total_assigned",
            "total_submitted",
            "total_graded",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]

    def get_total_questions(self, obj):
        return obj.task_items.filter(is_active=True).count()

    def get_total_assigned(self, obj):
        return obj.assignments.filter(is_active=True).count()

    def get_total_submitted(self, obj):
        return obj.assignments.filter(is_active=True, status="SUBMITTED").count()

    def get_total_graded(self, obj):
        return obj.assignments.filter(is_active=True, status="GRADED").count()


# =====================================================
# STUDENT ANSWER SERIALIZERS (for grading view)
# =====================================================


class StudentAnswerDetailSerializer(serializers.ModelSerializer):
    """Serializer for student answers with question details"""

    question_order = serializers.IntegerField(source="order", read_only=True)

    class Meta:
        model = SpecificStudentTaskItem
        fields = [
            "id",
            "question_text",
            "question_order",
            "marks",
            "answer_text",
            "answer_file",
            "marks_obtained",
            "teacher_remark",
            "submitted_at",
        ]
        read_only_fields = ["id", "question_text", "marks", "order"]


class StudentAssignmentDetailSerializer(serializers.ModelSerializer):
    """Serializer for student assignment with all answers"""

    student_info = StudentBasicInfoSerializer(source="student", read_only=True)
    class_info = AcademicClassBasicSerializer(source="academic_class", read_only=True)
    task_title = serializers.CharField(source="specific_task.title", read_only=True)
    task_total_marks = serializers.IntegerField(
        source="specific_task.total_marks", read_only=True
    )
    answers = StudentAnswerDetailSerializer(many=True, read_only=True)

    class Meta:
        model = SpecificStudentTaskAssignment
        fields = [
            "id",
            "student",
            "student_info",
            "class_info",
            "academic_class",
            "task_title",
            "task_total_marks",
            "status",
            "assigned_at",
            "answers",
            "is_active",
        ]
        read_only_fields = ["id", "assigned_at"]


# =====================================================
# GRADE SUBMISSION SERIALIZERS
# =====================================================


class GradeAnswerSerializer(serializers.Serializer):
    """Serializer for grading individual answers"""

    answer_id = serializers.IntegerField(required=True)
    marks_obtained = serializers.DecimalField(
        max_digits=5, decimal_places=2, required=True, allow_null=False
    )
    teacher_remark = serializers.CharField(required=False, allow_blank=True)


class GradeAssignmentSerializer(serializers.Serializer):
    """Serializer for grading an entire assignment"""

    answers = GradeAnswerSerializer(many=True, required=True)
    overall_remarks = serializers.CharField(required=False, allow_blank=True)


# =====================================================
# CLASS STUDENTS SERIALIZER (for dropdown when assigning)
# =====================================================


class ClassStudentSerializer(serializers.Serializer):
    """Serializer for students in a class (for assignment dropdown)"""

    enrollment_id = serializers.IntegerField()
    student_id = serializers.IntegerField()
    student_name = serializers.CharField()
    roll_number = serializers.IntegerField(allow_null=True)
    admission_number = serializers.CharField()
    is_active = serializers.BooleanField()


class ClassInfoSerializer(serializers.Serializer):
    """Serializer for class information"""

    id = serializers.IntegerField()
    name = serializers.CharField()
    standard = serializers.CharField(allow_null=True)
    section = serializers.CharField(allow_null=True)
    total_students = serializers.IntegerField()


class ClassStudentsResponseSerializer(serializers.Serializer):
    """Serializer for response when fetching class students"""

    class_info = ClassInfoSerializer()
    students = ClassStudentSerializer(many=True)


# =====================================================
# STATISTICS SERIALIZERS
# =====================================================


class SubjectStatSerializer(serializers.Serializer):
    """Subject-wise statistics"""

    subject = serializers.CharField()
    task_count = serializers.IntegerField()
    student_count = serializers.IntegerField()


class SpecificTaskStatisticsSerializer(serializers.Serializer):
    """Overall statistics for specific tasks"""

    period = serializers.DictField(child=serializers.CharField(), allow_null=True)
    statistics = serializers.DictField(child=serializers.IntegerField())
    subject_breakdown = SubjectStatSerializer(many=True)


# =====================================================
# TASK ASSIGNMENTS LIST SERIALIZER
# =====================================================


class TaskAssignmentListSerializer(serializers.ModelSerializer):
    """Serializer for listing assignments in a task"""

    student_name = serializers.SerializerMethodField()
    roll_number = serializers.IntegerField(
        source="enrollment.roll_number", read_only=True
    )
    answers_count = serializers.IntegerField(read_only=True, default=0)
    total_marks_obtained = serializers.DecimalField(
        max_digits=5, decimal_places=2, read_only=True, allow_null=True
    )

    class Meta:
        model = SpecificStudentTaskAssignment
        fields = [
            "id",
            "student_id",
            "student_name",
            "roll_number",
            "status",
            "assigned_at",
            "answers_count",
            "total_marks_obtained",
        ]

    def get_student_name(self, obj):
        if obj.student:
            return (
                obj.student.full_name
                or f"{obj.student.first_name} {obj.student.last_name}".strip()
            )
        return None


class TaskInfoSerializer(serializers.Serializer):
    """Task information for assignments view"""

    id = serializers.IntegerField()
    title = serializers.CharField()
    total_marks = serializers.IntegerField(allow_null=True)
    due_date = serializers.DateField(allow_null=True)
    total_questions = serializers.IntegerField()


class TaskAssignmentStatsSerializer(serializers.Serializer):
    """Statistics for task assignments"""

    total_assigned = serializers.IntegerField()
    submitted = serializers.IntegerField()
    graded = serializers.IntegerField()
    pending = serializers.IntegerField()
    submission_percentage = serializers.FloatField()


class TaskAssignmentsResponseSerializer(serializers.Serializer):
    """Response serializer for task assignments view"""

    task_info = TaskInfoSerializer()
    statistics = TaskAssignmentStatsSerializer()
    assignments = TaskAssignmentListSerializer(many=True)


class MyTaskSerializer(serializers.ModelSerializer):
    """
    Serializer for the teacher's own task list.
    Includes class/subject/type details plus submission summary counts.
    """

    class_name = serializers.SerializerMethodField()
    standard = serializers.CharField(
        source="academic_class.standard.name", read_only=True
    )
    section = serializers.CharField(
        source="academic_class.section.name", read_only=True
    )
    academic_year = serializers.CharField(
        source="academic_class.academic_year.name", read_only=True
    )
    subject_name = serializers.CharField(
        source="subject.name", read_only=True, default=None
    )
    task_type_name = serializers.CharField(
        source="task_type.name", read_only=True, default=None
    )
    task_type_code = serializers.CharField(
        source="task_type.code", read_only=True, default=None
    )

    # Annotated counts come in automatically — just declare them
    total_questions = serializers.IntegerField(read_only=True, default=0)
    total_submissions = serializers.IntegerField(read_only=True, default=0)
    checked_submissions = serializers.IntegerField(read_only=True, default=0)

    pending_submissions = serializers.SerializerMethodField()

    class Meta:
        model = ClassTask
        fields = [
            # identity
            "id",
            "title",
            "description",
            "document",
            # class
            "academic_class",
            "class_name",
            "standard",
            "section",
            "academic_year",
            # subject & type
            "subject",
            "subject_name",
            "task_type",
            "task_type_name",
            "task_type_code",
            # marks & dates
            "total_marks",
            "due_date",
            # state
            "is_published",
            "is_active",
            # counts
            "total_questions",
            "total_submissions",
            "checked_submissions",
            "pending_submissions",
            # timestamps
            "created_at",
            "updated_at",
        ]

    def get_class_name(self, obj):
        std = obj.academic_class.standard.name if obj.academic_class.standard else ""
        sec = obj.academic_class.section.name if obj.academic_class.section else ""
        return f"{std} - {sec}".strip(" -")

    def get_pending_submissions(self, obj):
        # total_submissions already excludes inactive; pending = submitted but not checked
        return (getattr(obj, "total_submissions", 0) or 0) - (
            getattr(obj, "checked_submissions", 0) or 0
        )


class StudentBasicAttendanceSerializer(serializers.ModelSerializer):
    """Basic student info for attendance marking"""

    full_name = serializers.SerializerMethodField()
    roll_number = serializers.IntegerField(source="enrollment.roll_number")
    enrollment_id = serializers.IntegerField(source="enrollment.id")

    class Meta:
        model = Student
        fields = ["id", "full_name", "admission_number", "roll_number", "enrollment_id"]

    def get_full_name(self, obj):
        return obj.full_name or f"{obj.first_name} {obj.last_name}".strip()


class AttendanceSessionSerializer(serializers.ModelSerializer):
    """Serializer for attendance session"""

    class_name = serializers.CharField(source="academic_class.__str__")
    taken_by_name = serializers.CharField(source="taken_by.full_name", read_only=True)
    subject_name = serializers.CharField(
        source="subject.name", read_only=True, allow_null=True
    )

    class Meta:
        model = AttendanceSession
        fields = [
            "id",
            "academic_class",
            "class_name",
            "subject",
            "subject_name",
            "taken_by",
            "taken_by_name",
            "date",
            "session_type",
            "status",
            "total_students",
            "present_count",
            "absent_count",
            "late_count",
            "leave_count",
            "remarks",
            "created_at",
            "updated_at",
        ]
        read_only_fields = [
            "id",
            "total_students",
            "present_count",
            "absent_count",
            "late_count",
            "leave_count",
            "created_at",
            "updated_at",
        ]


class AttendanceSessionStartSerializer(serializers.Serializer):
    """Serializer for starting a new attendance session"""

    academic_class_id = serializers.IntegerField(required=True)
    remarks = serializers.CharField(required=False, allow_blank=True)
    date = serializers.DateField(required=False)


class StudentAttendanceSerializer(serializers.ModelSerializer):
    """Serializer for student attendance records"""

    student_name = serializers.SerializerMethodField()
    roll_number = serializers.IntegerField(source="enrollment.roll_number")
    student_id = serializers.IntegerField(source="student.id")
    enrollment_id = serializers.IntegerField(source="enrollment.id")

    class Meta:
        model = StudentAttendance
        fields = [
            "id",
            "session",
            "enrollment_id",
            "student_id",
            "student_name",
            "roll_number",
            "status",
            "remarks",
            "late_minutes",
            "marked_at",
            "updated_at",
        ]
        read_only_fields = ["id", "marked_at", "updated_at"]

    def get_student_name(self, obj):
        return (
            obj.student.full_name
            or f"{obj.student.first_name} {obj.student.last_name}".strip()
        )


class MarkAttendanceSerializer(serializers.Serializer):
    """Serializer for marking individual student attendance"""

    enrollment_id = serializers.IntegerField(required=True)
    status = serializers.ChoiceField(
        choices=["PRESENT", "ABSENT", "LATE", "LEAVE", "HALF_DAY"]
    )
    remarks = serializers.CharField(required=False, allow_blank=True)
    late_minutes = serializers.IntegerField(required=False, min_value=0, max_value=480)

    def validate(self, data):
        if data.get("status") == "LATE" and not data.get("late_minutes"):
            data["late_minutes"] = 15  # Default 15 minutes late
        return data


class BulkAttendanceSerializer(serializers.Serializer):
    """Serializer for bulk attendance marking"""

    attendance_data = MarkAttendanceSerializer(many=True, required=True)

    def validate_attendance_data(self, value):
        if not value:
            raise serializers.ValidationError(
                "At least one attendance record is required"
            )

        # Check for duplicate enrollment_ids
        enrollment_ids = [item["enrollment_id"] for item in value]
        if len(enrollment_ids) != len(set(enrollment_ids)):
            raise serializers.ValidationError("Duplicate enrollment entries found")

        return value


class TodayAttendanceStatusSerializer(serializers.Serializer):
    """Serializer for today's attendance status response"""

    has_taken_attendance = serializers.BooleanField()
    session_id = serializers.IntegerField(allow_null=True)
    session_status = serializers.CharField(allow_null=True)
    academic_class_id = serializers.IntegerField(allow_null=True)
    academic_class_name = serializers.CharField(allow_null=True)
    message = serializers.CharField()
    total_students = serializers.IntegerField(default=0)
    marked_count = serializers.IntegerField(default=0)


class AttendanceHistorySerializer(serializers.ModelSerializer):
    """Serializer for attendance history list"""

    class_name = serializers.CharField(source="academic_class.__str__")
    attendance_percentage = serializers.SerializerMethodField()

    class Meta:
        model = AttendanceSession
        fields = [
            "id",
            "date",
            "class_name",
            "session_type",
            "status",
            "total_students",
            "present_count",
            "absent_count",
            "late_count",
            "leave_count",
            "attendance_percentage",
        ]

    def get_attendance_percentage(self, obj):
        if obj.total_students > 0:
            present = obj.present_count + obj.late_count
            return round((present / obj.total_students) * 100, 2)
        return 0


class AttendanceSummarySerializer(serializers.ModelSerializer):
    """Serializer for attendance summary"""

    student_name = serializers.SerializerMethodField()
    class_name = serializers.CharField(source="academic_class.__str__")
    roll_number = serializers.IntegerField(source="enrollment.roll_number")

    class Meta:
        model = AttendanceSummary
        fields = [
            "id",
            "student_name",
            "roll_number",
            "class_name",
            "month",
            "year",
            "total_working_days",
            "present_days",
            "absent_days",
            "late_days",
            "leave_days",
            "half_days",
            "attendance_percentage",
            "is_below_minimum",
        ]

    def get_student_name(self, obj):
        return (
            obj.student.full_name
            or f"{obj.student.first_name} {obj.student.last_name}".strip()
        )


class AttendanceReportFilterSerializer(serializers.Serializer):
    """Serializer for attendance report filters"""

    month = serializers.IntegerField(required=False, min_value=1, max_value=12)
    year = serializers.IntegerField(required=False)
    class_id = serializers.IntegerField(required=False)
    student_id = serializers.IntegerField(required=False)
    below_minimum = serializers.BooleanField(required=False, default=False)


# =====================================================
# LEAVE APPROVAL SERIALIZERS
# =====================================================

# =====================================================
# LEAVE APPROVAL SERIALIZERS (FIXED)
# =====================================================


class LeaveRequestListSerializer(serializers.ModelSerializer):
    """Serializer for listing leave requests"""

    student_name = serializers.SerializerMethodField()
    student_roll_number = serializers.SerializerMethodField()
    student_admission_number = serializers.SerializerMethodField()
    student_photo = serializers.SerializerMethodField()  # Changed from student_photo
    class_name = serializers.SerializerMethodField()
    section_name = serializers.SerializerMethodField()
    total_days = serializers.SerializerMethodField()
    document_url = serializers.SerializerMethodField()

    class Meta:
        model = AttendanceLeave
        fields = [
            "id",
            "leave_type",
            "from_date",
            "to_date",
            "reason",
            "status",
            "created_at",
            "student_name",
            "student_roll_number",
            "student_admission_number",
            "student_photo",
            "class_name",
            "section_name",
            "total_days",
            "document_url",
        ]

    def get_student_name(self, obj):
        if obj.student:
            return (
                obj.student.full_name
                or f"{obj.student.first_name} {obj.student.last_name}".strip()
            )
        return "Unknown"

    def get_student_roll_number(self, obj):
        return obj.enrollment.roll_number if obj.enrollment else None

    def get_student_admission_number(self, obj):
        if obj.student:
            return obj.student.admission_number
        return None

    def get_student_photo(self, obj):
        """Get student profile image URL - FIXED: use profile_image not photo"""
        if obj.student and obj.student.profile_image:
            return obj.student.profile_image.url
        return None

    def get_class_name(self, obj):
        if obj.enrollment and obj.enrollment.academic_class:
            return obj.enrollment.academic_class.standard.name
        return None

    def get_section_name(self, obj):
        if (
            obj.enrollment
            and obj.enrollment.academic_class
            and obj.enrollment.academic_class.section
        ):
            return obj.enrollment.academic_class.section.name
        return None

    def get_total_days(self, obj):
        return (obj.to_date - obj.from_date).days + 1

    def get_document_url(self, obj):
        if obj.document:
            return obj.document.url
        return None


class LeaveRequestDetailSerializer(serializers.ModelSerializer):
    """Detailed serializer for leave request"""

    student_name = serializers.SerializerMethodField()
    student_roll_number = serializers.SerializerMethodField()
    student_admission_number = serializers.SerializerMethodField()
    student_photo = serializers.SerializerMethodField()  # FIXED
    student_phone = serializers.SerializerMethodField()  # FIXED: use personal_phone
    student_email = serializers.SerializerMethodField()  # FIXED: use personal_email
    class_info = serializers.SerializerMethodField()
    total_days = serializers.SerializerMethodField()
    document_url = serializers.SerializerMethodField()
    days_list = serializers.SerializerMethodField()
    parent_info = serializers.SerializerMethodField()  # Added parent info

    class Meta:
        model = AttendanceLeave
        fields = [
            "id",
            "leave_type",
            "from_date",
            "to_date",
            "reason",
            "status",
            "document_url",
            "created_at",
            "student_name",
            "student_roll_number",
            "student_admission_number",
            "student_photo",
            "student_phone",
            "student_email",
            "class_info",
            "total_days",
            "days_list",
            "rejection_reason",
            "parent_info",
        ]

    def get_student_name(self, obj):
        if obj.student:
            return (
                obj.student.full_name
                or f"{obj.student.first_name} {obj.student.last_name}".strip()
            )
        return "Unknown"

    def get_student_roll_number(self, obj):
        return obj.enrollment.roll_number if obj.enrollment else None

    def get_student_admission_number(self, obj):
        if obj.student:
            return obj.student.admission_number
        return None

    def get_student_photo(self, obj):
        """FIXED: Use profile_image not photo"""
        if obj.student and obj.student.profile_image:
            return obj.student.profile_image.url
        return None

    def get_student_phone(self, obj):
        """FIXED: Use personal_phone"""
        if obj.student:
            return obj.student.personal_phone
        return None

    def get_student_email(self, obj):
        """FIXED: Use personal_email"""
        if obj.student:
            return obj.student.personal_email
        return None

    def get_class_info(self, obj):
        if obj.enrollment and obj.enrollment.academic_class:
            return {
                "id": obj.enrollment.academic_class.id,
                "name": str(obj.enrollment.academic_class),
                "standard": obj.enrollment.academic_class.standard.name,
                "section": (
                    obj.enrollment.academic_class.section.name
                    if obj.enrollment.academic_class.section
                    else None
                ),
            }
        return None

    def get_total_days(self, obj):
        return (obj.to_date - obj.from_date).days + 1

    def get_document_url(self, obj):
        if obj.document:
            return obj.document.url
        return None

    def get_days_list(self, obj):
        """Return list of dates for the leave period"""
        from datetime import timedelta

        days = []
        current = obj.from_date
        while current <= obj.to_date:
            days.append(current.isoformat())
            current += timedelta(days=1)
        return days

    def get_parent_info(self, obj):
        """Get parent/guardian information for the student"""
        if obj.student:
            # Get primary parent through StudentParent relationship
            student_parent = (
                StudentParent.objects.filter(
                    student=obj.student, is_active=True, is_primary_contact=True
                )
                .select_related("parent")
                .first()
            )

            if student_parent and student_parent.parent:
                return {
                    "id": student_parent.parent.id,
                    "name": student_parent.parent.full_name,
                    "phone": student_parent.parent.phone,
                    "email": student_parent.parent.email,
                    "relationship": student_parent.relationship,
                }

            # If no primary parent, get any active parent
            student_parent = (
                StudentParent.objects.filter(student=obj.student, is_active=True)
                .select_related("parent")
                .first()
            )

            if student_parent and student_parent.parent:
                return {
                    "id": student_parent.parent.id,
                    "name": student_parent.parent.full_name,
                    "phone": student_parent.parent.phone,
                    "email": student_parent.parent.email,
                    "relationship": student_parent.relationship,
                }
        return None


class LeaveApproveSerializer(serializers.Serializer):
    """Serializer for approving leave request"""

    remarks = serializers.CharField(required=False, allow_blank=True)


class LeaveRejectSerializer(serializers.Serializer):
    """Serializer for rejecting leave request"""

    rejection_reason = serializers.CharField(required=True)


class BulkLeaveActionSerializer(serializers.Serializer):
    """Serializer for bulk actions on leave requests"""

    leave_ids = serializers.ListField(child=serializers.IntegerField(), required=True)
    action = serializers.ChoiceField(choices=["approve", "reject"], required=True)
    rejection_reason = serializers.CharField(required=False, allow_blank=True)
    remarks = serializers.CharField(required=False, allow_blank=True)


class LeaveStatisticsSerializer(serializers.Serializer):
    """Serializer for leave statistics"""

    total_pending = serializers.IntegerField()
    total_approved = serializers.IntegerField()
    total_rejected = serializers.IntegerField()
    total_this_month = serializers.IntegerField()
    medical_leaves = serializers.IntegerField()
    family_leaves = serializers.IntegerField()
    emergency_leaves = serializers.IntegerField()


# =====================================================
# STUDY MATERIAL SERIALIZERS
# =====================================================

import os as _os

from teacher.models import StudyMaterial, PreviousYearPaper


class StudyMaterialSerializer(serializers.ModelSerializer):
    subject_name = serializers.CharField(source="subject.name", read_only=True)
    standard_name = serializers.CharField(source="subject.standard.name", read_only=True)
    class_name = serializers.SerializerMethodField(read_only=True)
    uploaded_by_name = serializers.SerializerMethodField(read_only=True)
    file_url = serializers.SerializerMethodField(read_only=True)
    file_name = serializers.SerializerMethodField(read_only=True)
    material_type_display = serializers.CharField(source="get_material_type_display", read_only=True)

    class Meta:
        model = StudyMaterial
        fields = [
            "id",
            "title",
            "description",
            "subject",
            "subject_name",
            "standard_name",
            "academic_class",
            "class_name",
            "material_type",
            "material_type_display",
            "file",
            "file_url",
            "file_name",
            "uploaded_by",
            "uploaded_by_name",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "uploaded_by", "is_active", "created_at", "updated_at"]
        extra_kwargs = {"file": {"required": True}}

    def get_class_name(self, obj):
        if obj.academic_class:
            return str(obj.academic_class)
        return None

    def get_uploaded_by_name(self, obj):
        if obj.uploaded_by:
            return f"{obj.uploaded_by.first_name} {obj.uploaded_by.last_name}".strip()
        return None

    def get_file_url(self, obj):
        if obj.file:
            request = self.context.get("request")
            if request:
                return request.build_absolute_uri(obj.file.url)
            return obj.file.url
        return None

    def get_file_name(self, obj):
        if obj.file:
            return _os.path.basename(obj.file.name)
        return None

    def validate_file(self, value):
        max_size = 50 * 1024 * 1024
        if value.size > max_size:
            raise serializers.ValidationError("File size must not exceed 50MB.")
        allowed = [".pdf", ".doc", ".docx", ".ppt", ".pptx", ".txt", ".epub", ".zip"]
        ext = _os.path.splitext(value.name)[1].lower()
        if ext not in allowed:
            raise serializers.ValidationError(
                f"Unsupported format. Allowed: {', '.join(allowed)}"
            )
        return value


class PreviousYearPaperSerializer(serializers.ModelSerializer):
    subject_name = serializers.CharField(source="subject.name", read_only=True)
    standard_name = serializers.CharField(source="standard.name", read_only=True)
    uploaded_by_name = serializers.SerializerMethodField(read_only=True)
    file_url = serializers.SerializerMethodField(read_only=True)
    file_name = serializers.SerializerMethodField(read_only=True)
    exam_type_display = serializers.CharField(source="get_exam_type_display", read_only=True)

    class Meta:
        model = PreviousYearPaper
        fields = [
            "id",
            "title",
            "subject",
            "subject_name",
            "standard",
            "standard_name",
            "year",
            "exam_type",
            "exam_type_display",
            "file",
            "file_url",
            "file_name",
            "uploaded_by",
            "uploaded_by_name",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "uploaded_by", "is_active", "created_at", "updated_at"]
        extra_kwargs = {"file": {"required": True}}

    def get_uploaded_by_name(self, obj):
        if obj.uploaded_by:
            return f"{obj.uploaded_by.first_name} {obj.uploaded_by.last_name}".strip()
        return None

    def get_file_url(self, obj):
        if obj.file:
            request = self.context.get("request")
            if request:
                return request.build_absolute_uri(obj.file.url)
            return obj.file.url
        return None

    def get_file_name(self, obj):
        if obj.file:
            return _os.path.basename(obj.file.name)
        return None

    def validate_file(self, value):
        max_size = 50 * 1024 * 1024
        if value.size > max_size:
            raise serializers.ValidationError("File size must not exceed 50MB.")
        allowed = [".pdf", ".doc", ".docx", ".ppt", ".pptx", ".txt", ".epub", ".zip"]
        ext = _os.path.splitext(value.name)[1].lower()
        if ext not in allowed:
            raise serializers.ValidationError(
                f"Unsupported format. Allowed: {', '.join(allowed)}"
            )
        return value

    def validate_year(self, value):
        if value < 2000 or value > 2100:
            raise serializers.ValidationError("Year must be between 2000 and 2100.")
        return value
