# location_serializers.py
from rest_framework import serializers
from .models import Country, State, City, Area, Pincode


class CountrySerializer(serializers.ModelSerializer):
    """Serializer for Country model"""

    state_count = serializers.IntegerField(source="states.count", read_only=True)
    city_count = serializers.SerializerMethodField()

    class Meta:
        model = Country
        fields = [
            "code",
            "name",
            "phone_code",
            "currency_code",
            "currency_symbol",
            "timezone",
            "is_active",
            "sort_order",
            "metadata",
            "state_count",
            "city_count",
        ]

    def get_city_count(self, obj):
        return City.objects.filter(state__country=obj).count()


class StateSerializer(serializers.ModelSerializer):
    """Serializer for State model"""

    country_name = serializers.CharField(source="country.name", read_only=True)
    country_code = serializers.CharField(source="country.code", read_only=True)
    city_count = serializers.IntegerField(source="cities.count", read_only=True)

    class Meta:
        model = State
        fields = [
            "id",
            "country",
            "country_name",
            "country_code",
            "code",
            "name",
            "local_name",
            "capital",
            "area_sq_km",
            "population",
            "is_active",
            "sort_order",
            "metadata",
            "city_count",
        ]


class CitySerializer(serializers.ModelSerializer):
    """Serializer for City model"""

    state_name = serializers.CharField(source="state.name", read_only=True)
    country_name = serializers.CharField(source="state.country.name", read_only=True)
    area_count = serializers.IntegerField(source="areas.count", read_only=True)

    class Meta:
        model = City
        fields = [
            "id",
            "state",
            "state_name",
            "country_name",
            "name",
            "local_name",
            "is_metro",
            "latitude",
            "longitude",
            "population",
            "is_active",
            "sort_order",
            "metadata",
            "area_count",
        ]


class AreaSerializer(serializers.ModelSerializer):
    """Serializer for Area model"""

    city_name = serializers.CharField(source="city.name", read_only=True)
    state_name = serializers.CharField(source="city.state.name", read_only=True)
    pincode_count = serializers.IntegerField(source="pincodes.count", read_only=True)

    class Meta:
        model = Area
        fields = [
            "id",
            "city",
            "city_name",
            "state_name",
            "name",
            "local_name",
            "pincode",
            "zone",
            "is_active",
            "sort_order",
            "metadata",
            "pincode_count",
        ]


class PincodeSerializer(serializers.ModelSerializer):
    """Serializer for Pincode model"""

    area_name = serializers.CharField(source="area.name", read_only=True)
    city_name = serializers.CharField(source="area.city.name", read_only=True)
    state_name = serializers.CharField(source="area.city.state.name", read_only=True)

    class Meta:
        model = Pincode
        fields = [
            "id",
            "area",
            "area_name",
            "city_name",
            "state_name",
            "pincode",
            "delivery_office",
            "delivery_status",
            "is_active",
            "metadata",
        ]
