# stats/serializers.py

from rest_framework import serializers
from datetime import datetime, timedelta
from decimal import Decimal
from django.db.models.functions import TruncMonth, ExtractWeek, ExtractYear


class DashboardSummarySerializer(serializers.Serializer):
    """Dashboard summary statistics"""

    total_students = serializers.IntegerField()
    total_teachers = serializers.IntegerField()
    total_parents = serializers.IntegerField()
    total_classes = serializers.IntegerField()
    total_active_classes = serializers.IntegerField()
    total_subjects = serializers.IntegerField()
    active_enrollments = serializers.IntegerField()
    new_students_this_month = serializers.IntegerField()
    # Today attendance
    today_present_students = serializers.IntegerField()
    today_absent_students = serializers.IntegerField()
    today_late_students = serializers.IntegerField()
    today_leave_students = serializers.IntegerField()
    today_total_marked = serializers.IntegerField()
    today_attendance_percentage = serializers.FloatField()
    # Tasks / exams
    pending_tasks = serializers.IntegerField()
    upcoming_exams = serializers.IntegerField()
    # Fee
    total_fee_expected = serializers.FloatField()
    total_fee_collected = serializers.FloatField()
    pending_fee_amount = serializers.FloatField()
    collection_percentage = serializers.FloatField()
    # Academics
    overall_pass_percentage = serializers.FloatField()


class StudentAdmissionTrendSerializer(serializers.Serializer):
    """Student admission trend over months/years"""

    period = serializers.CharField()
    count = serializers.IntegerField()


class ClassPerformanceSerializer(serializers.Serializer):
    """Class performance metrics"""

    class_id = serializers.IntegerField()
    class_name = serializers.CharField()
    total_students = serializers.IntegerField()
    average_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    pass_count = serializers.IntegerField()
    fail_count = serializers.IntegerField()
    pass_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    rank = serializers.IntegerField()


class SubjectPerformanceSerializer(serializers.Serializer):
    """Subject performance metrics"""

    subject_id = serializers.IntegerField()
    subject_name = serializers.CharField()
    subject_code = serializers.CharField()
    class_name = serializers.CharField()
    average_marks = serializers.DecimalField(max_digits=5, decimal_places=2)
    highest_marks = serializers.DecimalField(max_digits=5, decimal_places=2)
    lowest_marks = serializers.DecimalField(max_digits=5, decimal_places=2)
    pass_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class TeacherPerformanceSerializer(serializers.Serializer):
    """Teacher performance metrics"""

    teacher_id = serializers.IntegerField()
    teacher_name = serializers.CharField()
    employee_id = serializers.CharField()
    subject_name = serializers.CharField()
    class_name = serializers.CharField()
    students_count = serializers.IntegerField()
    average_marks = serializers.DecimalField(max_digits=5, decimal_places=2)
    pass_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class TopPerformingStudentSerializer(serializers.Serializer):
    """Top performing student details"""

    student_id = serializers.IntegerField()
    student_name = serializers.CharField()
    roll_number = serializers.CharField()
    class_name = serializers.CharField()
    total_marks = serializers.DecimalField(max_digits=8, decimal_places=2)
    percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    rank = serializers.IntegerField()


class FeeCollectionSerializer(serializers.Serializer):
    """Fee collection analytics"""

    period = serializers.CharField()
    total_collected = serializers.DecimalField(max_digits=15, decimal_places=2)
    total_expected = serializers.DecimalField(max_digits=15, decimal_places=2)
    pending_amount = serializers.DecimalField(max_digits=15, decimal_places=2)
    collection_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class AttendanceAnalyticsSerializer(serializers.Serializer):
    """Attendance analytics"""

    period = serializers.CharField()
    total_students = serializers.IntegerField()
    present_count = serializers.IntegerField()
    absent_count = serializers.IntegerField()
    late_count = serializers.IntegerField()
    leave_count = serializers.IntegerField()
    attendance_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class GenderDistributionSerializer(serializers.Serializer):
    """Gender distribution statistics"""

    male_count = serializers.IntegerField()
    female_count = serializers.IntegerField()
    other_count = serializers.IntegerField()
    male_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    female_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    other_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class StandardWiseDistributionSerializer(serializers.Serializer):
    """Standard wise student distribution"""

    standard_id = serializers.IntegerField()
    standard_name = serializers.CharField()
    total_students = serializers.IntegerField()
    sections_count = serializers.IntegerField()
    boys_count = serializers.IntegerField()
    girls_count = serializers.IntegerField()


class ReportFilterSerializer(serializers.Serializer):
    """Filter serializer for reports"""

    start_date = serializers.DateField(required=False)
    end_date = serializers.DateField(required=False)
    academic_year_id = serializers.IntegerField(required=False)
    class_id = serializers.IntegerField(required=False)
    standard_id = serializers.IntegerField(required=False)
    subject_id = serializers.IntegerField(required=False)
    teacher_id = serializers.IntegerField(required=False)


class RecentActivitySerializer(serializers.Serializer):
    """Serializer for recent activities"""

    id = serializers.IntegerField()
    title = serializers.CharField()
    description = serializers.CharField()
    timeAgo = serializers.CharField()
    status = serializers.CharField()
    icon = serializers.CharField()


class QuickStatsSerializer(serializers.Serializer):
    """Serializer for quick statistics"""

    icon = serializers.CharField()
    label = serializers.CharField()
    value = serializers.CharField()
    trend = serializers.CharField(required=False, allow_null=True)
    color = serializers.CharField()
    delay = serializers.IntegerField(default=0)


class DashboardSummarySerializer(serializers.Serializer):
    """Serializer for dashboard summary"""

    total_students = serializers.IntegerField()
    total_teachers = serializers.IntegerField()
    total_parents = serializers.IntegerField()
    total_classes = serializers.IntegerField()
    total_active_classes = serializers.IntegerField()
    total_subjects = serializers.IntegerField()
    active_enrollments = serializers.IntegerField()
    today_present_students = serializers.IntegerField()
    today_absent_students = serializers.IntegerField()
    upcoming_exams = serializers.IntegerField()
    pending_fee_amount = serializers.DecimalField(max_digits=15, decimal_places=2)
    total_fee_collected = serializers.DecimalField(max_digits=15, decimal_places=2)
    collection_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    overall_pass_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    pending_tasks = serializers.IntegerField()


class StudentAdmissionTrendSerializer(serializers.Serializer):
    """Serializer for student admission trend"""

    period = serializers.CharField()
    count = serializers.IntegerField()


class ClassPerformanceSerializer(serializers.Serializer):
    """Serializer for class performance"""

    class_id = serializers.IntegerField()
    class_name = serializers.CharField()
    total_students = serializers.IntegerField()
    average_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    pass_count = serializers.IntegerField()
    fail_count = serializers.IntegerField()
    pass_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    rank = serializers.IntegerField()


class TopPerformingStudentSerializer(serializers.Serializer):
    """Serializer for top performing students"""

    student_id = serializers.IntegerField()
    student_name = serializers.CharField()
    roll_number = serializers.CharField()
    class_name = serializers.CharField()
    total_marks = serializers.DecimalField(max_digits=8, decimal_places=2)
    percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    rank = serializers.IntegerField()


class SubjectPerformanceSerializer(serializers.Serializer):
    """Serializer for subject performance"""

    subject_id = serializers.IntegerField()
    subject_name = serializers.CharField()
    subject_code = serializers.CharField()
    class_name = serializers.CharField()
    average_marks = serializers.DecimalField(max_digits=5, decimal_places=2)
    highest_marks = serializers.DecimalField(max_digits=5, decimal_places=2)
    lowest_marks = serializers.DecimalField(max_digits=5, decimal_places=2)
    pass_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class TeacherPerformanceSerializer(serializers.Serializer):
    """Serializer for teacher performance"""

    teacher_id = serializers.IntegerField()
    teacher_name = serializers.CharField()
    employee_id = serializers.CharField()
    subject_name = serializers.CharField()
    class_name = serializers.CharField()
    students_count = serializers.IntegerField()
    average_marks = serializers.DecimalField(max_digits=5, decimal_places=2)
    pass_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class FeeCollectionSerializer(serializers.Serializer):
    """Serializer for fee collection analytics"""

    period = serializers.CharField()
    total_collected = serializers.DecimalField(max_digits=15, decimal_places=2)
    total_expected = serializers.DecimalField(max_digits=15, decimal_places=2)
    pending_amount = serializers.DecimalField(max_digits=15, decimal_places=2)
    collection_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class AttendanceAnalyticsSerializer(serializers.Serializer):
    """Serializer for attendance analytics"""

    period = serializers.CharField()
    total_students = serializers.IntegerField()
    present_count = serializers.IntegerField()
    absent_count = serializers.IntegerField()
    late_count = serializers.IntegerField()
    leave_count = serializers.IntegerField()
    attendance_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class GenderDistributionSerializer(serializers.Serializer):
    """Serializer for gender distribution"""

    male_count = serializers.IntegerField()
    female_count = serializers.IntegerField()
    other_count = serializers.IntegerField()
    male_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    female_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)
    other_percentage = serializers.DecimalField(max_digits=5, decimal_places=2)


class StandardWiseDistributionSerializer(serializers.Serializer):
    """Serializer for standard wise distribution"""

    standard_id = serializers.IntegerField()
    standard_name = serializers.CharField()
    total_students = serializers.IntegerField()
    sections_count = serializers.IntegerField()
    boys_count = serializers.IntegerField()
    girls_count = serializers.IntegerField()
