from rest_framework import serializers
from .models import (
    AnnouncementType,
    ClassAnnouncement,
    StudentAnnouncement,
    TeacherAnnouncement,
    CommonAnnouncement,
)
from academics.serializers import AcademicClassSerializer


class AnnouncementTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = AnnouncementType
        fields = ["id", "name", "code", "description", "is_active", "created_at"]
        read_only_fields = ["created_at"]


class ClassAnnouncementSerializer(serializers.ModelSerializer):
    announcement_type_name = serializers.CharField(
        source="announcement_type.name", read_only=True
    )
    academic_class_name = serializers.CharField(
        source="academic_class.name", read_only=True
    )

    class Meta:
        model = ClassAnnouncement
        fields = [
            "id",
            "announcement_type",
            "announcement_type_name",
            "title",
            "message",
            "academic_class",
            "academic_class_name",
            "expire_on",
            "priority",
            "created_by_external_user_id",
            "from_role",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["created_at", "updated_at"]


class StudentAnnouncementSerializer(serializers.ModelSerializer):
    announcement_type_name = serializers.CharField(
        source="announcement_type.name", read_only=True
    )
    academic_class_name = serializers.CharField(
        source="academic_class.name", read_only=True
    )

    class Meta:
        model = StudentAnnouncement
        fields = [
            "id",
            "announcement_type",
            "announcement_type_name",
            "title",
            "message",
            "section",
            "academic_class",
            "academic_class_name",
            "is_for_all_students",
            "expire_on",
            "priority",
            "created_by_external_user_id",
            "from_role",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["created_at", "updated_at"]


class TeacherAnnouncementSerializer(serializers.ModelSerializer):
    announcement_type_name = serializers.CharField(
        source="announcement_type.name", read_only=True
    )

    class Meta:
        model = TeacherAnnouncement
        fields = [
            "id",
            "announcement_type",
            "announcement_type_name",
            "title",
            "message",
            "department",
            "is_for_all_teachers",
            "expire_on",
            "priority",
            "created_by_external_user_id",
            "from_role",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["created_at", "updated_at"]


class CommonAnnouncementSerializer(serializers.ModelSerializer):
    announcement_type_name = serializers.CharField(
        source="announcement_type.name", read_only=True
    )

    class Meta:
        model = CommonAnnouncement
        fields = [
            "id",
            "announcement_type",
            "announcement_type_name",
            "title",
            "message",
            "expire_on",
            "priority",
            "created_by_external_user_id",
            "from_role",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["created_at", "updated_at"]


# Combined serializer for fetching all announcements
class CombinedAnnouncementSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    type = serializers.CharField()
    announcement_type = serializers.CharField(source="announcement_type.name")
    title = serializers.CharField()
    message = serializers.CharField()
    target = serializers.SerializerMethodField()
    expire_on = serializers.DateField()
    priority = serializers.CharField()
    from_role = serializers.CharField()
    created_at = serializers.DateTimeField()
    is_active = serializers.BooleanField()

    def get_target(self, obj):
        if isinstance(obj, ClassAnnouncement):
            return f"Class: {obj.academic_class.name}"
        elif isinstance(obj, StudentAnnouncement):
            if obj.is_for_all_students:
                return "All Students"
            elif obj.section:
                return f"Section: {obj.get_section_display()}"
            elif obj.academic_class:
                return f"Class: {obj.academic_class.name}"
            else:
                return "Students"
        elif isinstance(obj, TeacherAnnouncement):
            if obj.is_for_all_teachers:
                return "All Teachers"
            elif obj.department:
                return f"Department: {obj.department}"
            else:
                return "Teachers"
        elif isinstance(obj, CommonAnnouncement):
            return "Entire School"
        return "Unknown"
