"""
Serializers for CustomUser model.
Includes both full and minimal serializer representations.
"""

from rest_framework import serializers
from django.contrib.auth import get_user_model
from accounts.models.custom_user import UserContact
from core.models import Country

CustomUser = get_user_model()


class UserContactMinimalSerializer(serializers.ModelSerializer):
    """Minimal serializer for UserContact model."""

    class Meta:
        model = UserContact
        fields = [
            "id",
            "city",
            "state",
            "country",
            "timezone",
        ]


class UserContactSerializer(serializers.ModelSerializer):
    """Full serializer for UserContact model."""

    country_name = serializers.SerializerMethodField()

    class Meta:
        model = UserContact
        fields = [
            "id",
            "address_line1",
            "address_line2",
            "city",
            "state",
            "postal_code",
            "country",
            "country_name",
            "contact_info",
            "timezone",
            "availability",
        ]

    def get_country_name(self, obj):
        if obj.country:
            return obj.country.name
        return None


class CustomUserMinimalSerializer(serializers.ModelSerializer):
    """Minimal serializer for CustomUser model."""

    full_name = serializers.CharField(source="get_full_name", read_only=True)

    class Meta:
        model = CustomUser
        fields = [
            "id",
            "username",
            "email",
            "full_name",
            "role",
            "role_status",
            "subscription_tier",
            "is_active",
        ]
        read_only_fields = fields


class CustomUserSerializer(serializers.ModelSerializer):
    """Full serializer for CustomUser model."""

    full_name = serializers.CharField(source="get_full_name", read_only=True)
    contact = UserContactSerializer(read_only=True)

    class Meta:
        model = CustomUser
        fields = [
            "id",
            "username",
            "email",
            "first_name",
            "last_name",
            "full_name",
            "role",
            "role_status",
            "subscription_tier",
            "technical_skills",
            "specializations",
            "email_verified",
            "phone_verified",
            "two_factor_enabled",
            "last_active",
            "login_count",
            "date_joined",
            "is_active",
            "contact",
        ]
        read_only_fields = [
            "id",
            "date_joined",
            "last_active",
            "login_count",
            "email_verified",
            "phone_verified",
        ]

    def create(self, validated_data):
        """Create new user with contact information."""
        contact_data = self.context.get("contact_data", {})
        user = CustomUser.objects.create_user(**validated_data)

        if contact_data:
            UserContact.objects.create(user=user, **contact_data)

        return user

    def update(self, instance, validated_data):
        """Update user and related contact if provided."""
        contact_data = self.context.get("contact_data")

        # Update user fields
        for attr, value in validated_data.items():
            setattr(instance, attr, value)
        instance.save()

        # Update contact if data provided
        if contact_data and hasattr(instance, "contact"):
            contact = instance.contact
            for attr, value in contact_data.items():
                setattr(contact, attr, value)
            contact.save()

        return instance
