
from rest_framework import viewsets, permissions
from django.utils import timezone
from apps.geo.models import Country, State, District, Mandal, Pincode, FranchiseStore, FranchiseAssignment, StoreTransferLedger
from apps.geo.serializers import (
    CountrySerializer,
    StateSerializer,
    DistrictSerializer,
    MandalSerializer,
    PincodeSerializer,
    FranchiseStoreSerializer,
    FranchiseAssignmentSerializer,
    StoreTransferLedgerSerializer,
)

class CountryAdminViewSet(viewsets.ModelViewSet):
    queryset = Country.objects.all()
    serializer_class = CountrySerializer
    permission_classes = [permissions.IsAdminUser]

class StateAdminViewSet(viewsets.ModelViewSet):
    queryset = State.objects.all()
    serializer_class = StateSerializer
    permission_classes = [permissions.IsAdminUser]

class DistrictAdminViewSet(viewsets.ModelViewSet):
    queryset = District.objects.all()
    serializer_class = DistrictSerializer
    permission_classes = [permissions.IsAdminUser]


class MandalAdminViewSet(viewsets.ModelViewSet):
    queryset = Mandal.objects.all().order_by('name')
    serializer_class = MandalSerializer
    permission_classes = [permissions.IsAdminUser]

class PincodeAdminViewSet(viewsets.ModelViewSet):
    queryset = Pincode.objects.all()
    serializer_class = PincodeSerializer
    permission_classes = [permissions.IsAdminUser]


class FranchiseStoreAdminViewSet(viewsets.ModelViewSet):
    queryset = FranchiseStore.objects.select_related('state', 'district', 'mandal', 'pincode').all().order_by('name')
    serializer_class = FranchiseStoreSerializer
    permission_classes = [permissions.IsAdminUser]


class FranchiseAssignmentAdminViewSet(viewsets.ModelViewSet):
    queryset = FranchiseAssignment.objects.select_related('user', 'store', 'state', 'district', 'mandal').all().order_by('-created_at')
    serializer_class = FranchiseAssignmentSerializer
    permission_classes = [permissions.IsAdminUser]

    def _territory_filter(self, data):
        territory_level = data.get('territory_level')
        filters = {'territory_level': territory_level, 'is_active': True}
        if territory_level == FranchiseAssignment.TerritoryLevel.STATE:
            filters['state'] = data.get('state')
        elif territory_level == FranchiseAssignment.TerritoryLevel.DISTRICT:
            filters['district'] = data.get('district')
        elif territory_level == FranchiseAssignment.TerritoryLevel.MANDAL:
            filters['mandal'] = data.get('mandal')
        return filters

    def perform_create(self, serializer):
        data = serializer.validated_data
        filters = self._territory_filter(data)
        FranchiseAssignment.objects.filter(**filters).update(
            is_active=False,
            effective_to=timezone.now(),
            removed_by=self.request.user,
        )
        serializer.save(assigned_by=self.request.user)

    def perform_update(self, serializer):
        instance = self.get_object()
        became_inactive = serializer.validated_data.get('is_active') is False and instance.is_active
        update = serializer.save()
        if became_inactive and not update.effective_to:
            update.effective_to = timezone.now()
            update.removed_by = self.request.user
            update.save(update_fields=['effective_to', 'removed_by'])


class StoreTransferLedgerAdminViewSet(viewsets.ModelViewSet):
    queryset = StoreTransferLedger.objects.select_related('order', 'store', 'performed_by').all().order_by('-created_at')
    serializer_class = StoreTransferLedgerSerializer
    permission_classes = [permissions.IsAdminUser]

    def perform_create(self, serializer):
        serializer.save(performed_by=self.request.user)

    def perform_update(self, serializer):
        serializer.save(performed_by=self.request.user)
