from rest_framework import serializers
from .models import Country, State, District, Mandal, Pincode, FranchiseStore, FranchiseAssignment, StoreTransferLedger


class CountrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Country
        fields = ('id', 'name', 'code')


class StateSerializer(serializers.ModelSerializer):
    country = serializers.PrimaryKeyRelatedField(queryset=Country.objects.all())

    class Meta:
        model = State
        fields = ('id', 'name', 'country')


class DistrictSerializer(serializers.ModelSerializer):
    state = serializers.PrimaryKeyRelatedField(queryset=State.objects.all())

    class Meta:
        model = District
        fields = ('id', 'name', 'state')


class MandalSerializer(serializers.ModelSerializer):
    district = serializers.PrimaryKeyRelatedField(queryset=District.objects.all())

    class Meta:
        model = Mandal
        fields = ('id', 'name', 'district')

class PincodeSerializer(serializers.ModelSerializer):
    country = serializers.PrimaryKeyRelatedField(queryset=Country.objects.all(), required=False, allow_null=True)
    state = serializers.PrimaryKeyRelatedField(queryset=State.objects.all(), required=False, allow_null=True)
    district = serializers.PrimaryKeyRelatedField(queryset=District.objects.all(), required=False, allow_null=True)
    location = serializers.CharField(required=False, allow_blank=True, allow_null=True)

    class Meta:
        model = Pincode
        fields = ('id', 'code', 'country', 'state', 'district', 'location')


class FranchiseStoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = FranchiseStore
        fields = (
            'id',
            'code',
            'name',
            'country',
            'state',
            'district',
            'mandal',
            'pincode',
            'address_line1',
            'address_line2',
            'contact_name',
            'contact_mobile',
            'is_active',
        )


class FranchiseAssignmentSerializer(serializers.ModelSerializer):
    user_name = serializers.SerializerMethodField(read_only=True)
    store_name = serializers.CharField(source='store.name', read_only=True)

    class Meta:
        model = FranchiseAssignment
        fields = (
            'id',
            'user',
            'user_name',
            'store',
            'store_name',
            'territory_level',
            'state',
            'district',
            'mandal',
            'role_title',
            'performance_note',
            'assignment_reason',
            'effective_from',
            'effective_to',
            'assigned_by',
            'removed_by',
            'is_active',
        )
        read_only_fields = ('assigned_by', 'removed_by', 'effective_from', 'effective_to')

    def get_user_name(self, obj):
        first = (obj.user.first_name or '').strip()
        last = (obj.user.last_name or '').strip()
        full = f"{first} {last}".strip()
        return full or obj.user.mobile or obj.user.email or str(obj.user_id)

    def validate(self, attrs):
        territory_level = attrs.get('territory_level', getattr(self.instance, 'territory_level', None))
        state = attrs.get('state', getattr(self.instance, 'state', None))
        district = attrs.get('district', getattr(self.instance, 'district', None))
        mandal = attrs.get('mandal', getattr(self.instance, 'mandal', None))

        if territory_level == FranchiseAssignment.TerritoryLevel.STATE and not state:
            raise serializers.ValidationError({'state': 'State is required for state-level assignment.'})
        if territory_level == FranchiseAssignment.TerritoryLevel.DISTRICT and not district:
            raise serializers.ValidationError({'district': 'District is required for district-level assignment.'})
        if territory_level == FranchiseAssignment.TerritoryLevel.MANDAL and not mandal:
            raise serializers.ValidationError({'mandal': 'Mandal is required for mandal-level assignment.'})

        if district and state and district.state_id != state.id:
            raise serializers.ValidationError({'district': 'District must belong to selected state.'})
        if mandal and district and mandal.district_id != district.id:
            raise serializers.ValidationError({'mandal': 'Mandal must belong to selected district.'})

        return attrs


class StoreTransferLedgerSerializer(serializers.ModelSerializer):
    store_name = serializers.CharField(source='store.name', read_only=True)

    class Meta:
        model = StoreTransferLedger
        fields = (
            'id',
            'order',
            'store',
            'store_name',
            'transfer_type',
            'transfer_status',
            'quantity',
            'remarks',
            'performed_by',
            'created_at',
            'updated_at',
            'is_active',
        )
        read_only_fields = ('performed_by',)
