from rest_framework import serializers
from django.contrib.auth import authenticate
from users.models import User
from notices.models import Notice
from events.models import Event
from programs.models import Program
from faculty.models import Faculty
from gallery.models import GalleryImage
from admissions.models import AdmissionInquiry
from contact.models import ContactMessage


class DashboardStatsSerializer(serializers.Serializer):
    notices = serializers.IntegerField()
    events = serializers.IntegerField()
    programs = serializers.IntegerField()
    faculty = serializers.IntegerField()
    gallery = serializers.IntegerField()
    pending_admissions = serializers.IntegerField()
    unread_contacts = serializers.IntegerField()


class LoginSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField(write_only=True)

    def validate(self, data):
        user = authenticate(email=data["email"], password=data["password"])
        if not user:
            raise serializers.ValidationError("Invalid credentials.")
        if not user.is_active:
            raise serializers.ValidationError("Account is disabled.")
        data["user"] = user
        return data


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ["id", "email", "full_name", "role", "is_active", "created_at"]
        read_only_fields = ["id", "created_at"]


class CreateUserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, min_length=8)

    class Meta:
        model = User
        fields = ["email", "full_name", "role", "password"]

    def validate_role(self, value):
        request = self.context.get("request")
        if value == "superadmin" and (not request or request.user.role != "superadmin"):
            raise serializers.ValidationError("Only superadmin can create another superadmin.")
        return value

    def create(self, validated_data):
        password = validated_data.pop("password")
        user = User(**validated_data)
        user.set_password(password)
        if validated_data.get("role") in ("superadmin",):
            user.is_staff = True
        user.save()
        return user


class NoticeSerializer(serializers.ModelSerializer):
    created_by_name = serializers.SerializerMethodField()

    class Meta:
        model = Notice
        fields = "__all__"
        read_only_fields = ["id", "created_by", "created_at", "updated_at", "deleted_by"]

    def get_created_by_name(self, obj):
        return obj.created_by.full_name if obj.created_by else None

    def create(self, validated_data):
        validated_data["created_by"] = self.context["request"].user
        return super().create(validated_data)


class EventSerializer(serializers.ModelSerializer):
    created_by_name = serializers.SerializerMethodField()

    class Meta:
        model = Event
        fields = "__all__"
        read_only_fields = ["id", "created_by", "created_at", "updated_at", "deleted_by"]

    def get_created_by_name(self, obj):
        return obj.created_by.full_name if obj.created_by else None

    def create(self, validated_data):
        validated_data["created_by"] = self.context["request"].user
        return super().create(validated_data)


class ProgramSerializer(serializers.ModelSerializer):
    courses_input = serializers.CharField(write_only=True, required=False,
                                           help_text="Comma-separated list of courses")

    class Meta:
        model = Program
        fields = "__all__"
        read_only_fields = ["id", "created_by", "created_at", "updated_at", "deleted_by"]

    def validate(self, data):
        if "courses_input" in data:
            raw = data.pop("courses_input")
            data["courses"] = [c.strip() for c in raw.split(",") if c.strip()]
        return data

    def create(self, validated_data):
        validated_data["created_by"] = self.context["request"].user
        return super().create(validated_data)


class FacultySerializer(serializers.ModelSerializer):
    class Meta:
        model = Faculty
        fields = "__all__"
        read_only_fields = ["id", "created_by", "created_at", "updated_at", "deleted_by"]

    def create(self, validated_data):
        validated_data["created_by"] = self.context["request"].user
        return super().create(validated_data)


class GalleryImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = GalleryImage
        fields = "__all__"
        read_only_fields = ["id", "created_by", "created_at"]

    def create(self, validated_data):
        validated_data["created_by"] = self.context["request"].user
        return super().create(validated_data)


class AdmissionInquirySerializer(serializers.ModelSerializer):
    program_name = serializers.SerializerMethodField()

    class Meta:
        model = AdmissionInquiry
        fields = "__all__"
        read_only_fields = ["id", "reviewed_by", "created_at", "updated_at", "created_by"]

    def get_program_name(self, obj):
        return obj.program.name if obj.program else None


class AdmissionStatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = AdmissionInquiry
        fields = ["status"]


class ContactMessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContactMessage
        fields = "__all__"
        read_only_fields = ["id", "deleted_at", "created_at"]


class ContactStatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContactMessage
        fields = ["status"]
