# people/serializers.py
import logging
from rest_framework import serializers
from django.contrib.auth import get_user_model
from .models import Teacher, Parent, Student, StudentParent

logger = logging.getLogger(__name__)
User = get_user_model()


class TeacherSerializer(serializers.ModelSerializer):
    """Clean Teacher Serializer"""

    full_name = serializers.SerializerMethodField()
    profile_image_url = serializers.SerializerMethodField()

    # User creation fields (defined as class attributes)
    create_user_account = serializers.BooleanField(
        write_only=True, required=False, default=False
    )
    user_email = serializers.EmailField(write_only=True, required=False)
    user_password = serializers.CharField(
        write_only=True, required=False, style={"input_type": "password"}, min_length=8
    )

    class Meta:
        model = Teacher
        fields = [
            "id",
            "external_user_id",
            "first_name",
            "middle_name",
            "last_name",
            "full_name",
            "email",
            "phone",
            "alternate_phone",
            "employee_id",
            "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",
            "is_active",
            "profile_image",
            "profile_image_url",
            "created_at",
            "updated_at",
            "deleted_at",
            "create_user_account",
            "user_email",
            "user_password",
        ]
        read_only_fields = [
            "external_user_id",
            "created_at",
            "updated_at",
            "deleted_at",
        ]

    def get_full_name(self, obj):
        return obj.full_name

    def get_profile_image_url(self, obj):
        if obj.profile_image:
            request = self.context.get("request")
            if request:
                return request.build_absolute_uri(obj.profile_image.url)
            return obj.profile_image.url
        return None

    def validate_employee_id(self, value):
        if value and Teacher.objects.filter(employee_id=value).exists():
            if self.instance and self.instance.employee_id == value:
                return value
            raise serializers.ValidationError(
                "A teacher with this employee ID already exists."
            )
        return value

    def validate(self, data):
        """Validate user creation fields"""
        create_user_account = data.get("create_user_account", False)
        user_email = data.get("user_email")
        user_password = data.get("user_password")

        if create_user_account:
            if not user_email:
                raise serializers.ValidationError(
                    {"user_email": "Email is required when creating a user account."}
                )
            if not user_password:
                raise serializers.ValidationError(
                    {
                        "user_password": "Password is required when creating a user account."
                    }
                )

            # Check if email exists in master DB
            if User.objects.using("default").filter(email=user_email).exists():
                raise serializers.ValidationError(
                    {
                        "user_email": "A user with this email already exists in master database."
                    }
                )

        return data

    def create(self, validated_data):
        """Override create to remove user creation fields"""
        validated_data.pop("create_user_account", None)
        validated_data.pop("user_email", None)
        validated_data.pop("user_password", None)
        return super().create(validated_data)

    def update(self, instance, validated_data):
        """Override update to remove user creation fields"""
        validated_data.pop("create_user_account", None)
        validated_data.pop("user_email", None)
        validated_data.pop("user_password", None)
        return super().update(instance, validated_data)


class TeacherSimpleSerializer(serializers.ModelSerializer):
    """Simple serializer for Teacher model"""

    full_name = serializers.SerializerMethodField()

    class Meta:
        model = Teacher
        fields = [
            "id",
            "external_user_id",
            "first_name",
            "last_name",
            "full_name",
            "email",
            "phone",
            "employee_id",
            "is_active",
        ]
        read_only_fields = ["id"]

    def get_full_name(self, obj):
        """Get teacher's full name"""
        if hasattr(obj, "full_name") and obj.full_name:
            return obj.full_name
        else:
            first_name = obj.first_name or ""
            last_name = obj.last_name or ""
            return f"{first_name} {last_name}".strip()


class StudentSerializer(serializers.ModelSerializer):
    """Clean Student Serializer"""

    full_name = serializers.SerializerMethodField()
    age = serializers.SerializerMethodField()
    profile_image_url = serializers.SerializerMethodField()

    # User creation fields
    create_user_account = serializers.BooleanField(
        write_only=True, required=False, default=False
    )
    user_email = serializers.EmailField(write_only=True, required=False)
    user_password = serializers.CharField(
        write_only=True, required=False, style={"input_type": "password"}, min_length=8
    )

    class Meta:
        model = Student
        fields = [
            "id",
            "external_user_id",
            "first_name",
            "middle_name",
            "last_name",
            "full_name",
            "student_id",
            "roll_number",
            "date_of_birth",
            "age",
            "gender",
            "personal_email",
            "personal_phone",
            "permanent_address_line_1",
            "permanent_address_line_2",
            "permanent_city",
            "permanent_state",
            "permanent_country",
            "permanent_pincode",
            "correspondence_address_line_1",
            "correspondence_address_line_2",
            "correspondence_city",
            "correspondence_state",
            "correspondence_country",
            "correspondence_pincode",
            "admission_date",
            "admission_number",
            "identification_number",
            "identification_type",
            "blood_group",
            "known_allergies",
            "medical_conditions",
            "emergency_contact_name",
            "emergency_contact_phone",
            "emergency_contact_relation",
            "is_active",
            "profile_image",
            "profile_image_url",
            "created_at",
            "updated_at",
            "deleted_at",
            "create_user_account",
            "user_email",
            "user_password",
        ]
        read_only_fields = [
            "external_user_id",
            "created_at",
            "updated_at",
            "deleted_at",
        ]

    def get_full_name(self, obj):
        return obj.full_name

    def get_age(self, obj):
        return obj.age

    def get_profile_image_url(self, obj):
        if obj.profile_image:
            request = self.context.get("request")
            if request:
                return request.build_absolute_uri(obj.profile_image.url)
            return obj.profile_image.url
        return None

    def validate_student_id(self, value):
        if value and Student.objects.filter(student_id=value).exists():
            if self.instance and self.instance.student_id == value:
                return value
            raise serializers.ValidationError(
                "A student with this student ID already exists."
            )
        return value

    def validate(self, data):
        """Validate user creation fields"""
        create_user_account = data.get("create_user_account", False)
        user_email = data.get("user_email")
        user_password = data.get("user_password")

        if create_user_account:
            if not user_email:
                raise serializers.ValidationError(
                    {"user_email": "Email is required when creating a user account."}
                )
            if not user_password:
                raise serializers.ValidationError(
                    {
                        "user_password": "Password is required when creating a user account."
                    }
                )

            # Check if email exists in master DB
            if User.objects.using("default").filter(email=user_email).exists():
                raise serializers.ValidationError(
                    {
                        "user_email": "A user with this email already exists in master database."
                    }
                )

        return data

    def create(self, validated_data):
        """Override create to remove user creation fields"""
        validated_data.pop("create_user_account", None)
        validated_data.pop("user_email", None)
        validated_data.pop("user_password", None)
        return super().create(validated_data)

    def update(self, instance, validated_data):
        """Override update to remove user creation fields"""
        validated_data.pop("create_user_account", None)
        validated_data.pop("user_email", None)
        validated_data.pop("user_password", None)
        return super().update(instance, validated_data)


class ParentSerializer(serializers.ModelSerializer):
    """Clean Parent Serializer"""

    full_name = serializers.SerializerMethodField()
    profile_image_url = serializers.SerializerMethodField()

    # User creation fields
    create_user_account = serializers.BooleanField(
        write_only=True, required=False, default=False
    )
    user_email = serializers.EmailField(write_only=True, required=False)
    user_password = serializers.CharField(
        write_only=True, required=False, style={"input_type": "password"}, min_length=8
    )

    class Meta:
        model = Parent
        fields = [
            "id",
            "external_user_id",
            "first_name",
            "middle_name",
            "last_name",
            "full_name",
            "email",
            "phone",
            "alternate_phone",
            "parent_type",
            "occupation",
            "annual_income",
            "address_line_1",
            "address_line_2",
            "city",
            "state",
            "country",
            "pincode",
            "date_of_birth",
            "gender",
            "identification_number",
            "identification_type",
            "is_primary",
            "is_active",
            "profile_image",
            "profile_image_url",
            "created_at",
            "updated_at",
            "deleted_at",
            "create_user_account",
            "user_email",
            "user_password",
        ]
        read_only_fields = [
            "external_user_id",
            "created_at",
            "updated_at",
            "deleted_at",
        ]

    def get_full_name(self, obj):
        return obj.full_name

    def get_profile_image_url(self, obj):
        if obj.profile_image:
            request = self.context.get("request")
            if request:
                return request.build_absolute_uri(obj.profile_image.url)
            return obj.profile_image.url
        return None

    def validate(self, data):
        """Validate user creation fields"""
        create_user_account = data.get("create_user_account", False)
        user_email = data.get("user_email")
        user_password = data.get("user_password")

        if create_user_account:
            if not user_email:
                raise serializers.ValidationError(
                    {"user_email": "Email is required when creating a user account."}
                )
            if not user_password:
                raise serializers.ValidationError(
                    {
                        "user_password": "Password is required when creating a user account."
                    }
                )

            # Check if email exists in master DB
            if User.objects.using("default").filter(email=user_email).exists():
                raise serializers.ValidationError(
                    {
                        "user_email": "A user with this email already exists in master database."
                    }
                )

        return data

    def create(self, validated_data):
        """Override create to remove user creation fields"""
        validated_data.pop("create_user_account", None)
        validated_data.pop("user_email", None)
        validated_data.pop("user_password", None)
        return super().create(validated_data)

    def update(self, instance, validated_data):
        """Override update to remove user creation fields"""
        validated_data.pop("create_user_account", None)
        validated_data.pop("user_email", None)
        validated_data.pop("user_password", None)
        return super().update(instance, validated_data)


# Simplified serializers - NO user creation fields
class SimpleTeacherSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()
    profile_image_url = serializers.SerializerMethodField()

    class Meta:
        model = Teacher
        fields = [
            "id",
            "first_name",
            "last_name",
            "full_name",
            "employee_id",
            "email",
            "phone",
            "profile_image_url",
        ]

    def get_full_name(self, obj):
        return obj.full_name

    def get_profile_image_url(self, obj):
        if obj.profile_image:
            request = self.context.get("request")
            if request:
                return request.build_absolute_uri(obj.profile_image.url)
            return obj.profile_image.url
        return None


class SimpleParentSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()
    profile_image_url = serializers.SerializerMethodField()

    class Meta:
        model = Parent
        fields = [
            "id",
            "first_name",
            "last_name",
            "full_name",
            "email",
            "phone",
            "parent_type",
            "profile_image_url",
        ]

    def get_full_name(self, obj):
        return obj.full_name

    def get_profile_image_url(self, obj):
        if obj.profile_image:
            request = self.context.get("request")
            if request:
                return request.build_absolute_uri(obj.profile_image.url)
            return obj.profile_image.url
        return None


class SimpleStudentSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()
    profile_image_url = serializers.SerializerMethodField()

    class Meta:
        model = Student
        fields = [
            "id",
            "first_name",
            "last_name",
            "full_name",
            "student_id",
            "roll_number",
            "profile_image_url",
        ]

    def get_full_name(self, obj):
        return obj.full_name

    def get_profile_image_url(self, obj):
        if obj.profile_image:
            request = self.context.get("request")
            if request:
                return request.build_absolute_uri(obj.profile_image.url)
            return obj.profile_image.url
        return None


class StudentParentSerializer(serializers.ModelSerializer):
    """Serializer for Student-Parent relationships"""

    # Instead of using StringRelatedField, use nested serializers
    student_details = SimpleStudentSerializer(source="student", read_only=True)
    parent_details = SimpleParentSerializer(source="parent", read_only=True)

    class Meta:
        model = StudentParent
        fields = [
            "id",
            "student",
            "parent",
            "student_details",
            "parent_details",
            "relationship",
            "is_primary_contact",
            "can_pickup",
            "has_medical_consent",
            "has_academic_access",
            "receive_notifications",
            "notification_preferences",
            "is_active",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["created_at", "updated_at"]

    def to_representation(self, instance):
        """Custom representation to ensure consistent data structure"""
        representation = super().to_representation(instance)

        # Add student_name and parent_name for backward compatibility
        if instance.student:
            representation["student_name"] = (
                f"{instance.student.first_name} {instance.student.last_name}"
            )
        if instance.parent:
            representation["parent_name"] = (
                f"{instance.parent.first_name} {instance.parent.last_name}"
            )

        return representation
