"""
Localization Views — API endpoints for localization data.
"""
from rest_framework import permissions, status, viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import (
    CalendarSystem,
    City,
    Country,
    Currency,
    Language,
    Province,
    Timezone,
    UserLocalePreference,
)
from .serializers import (
    ActiveLocaleSerializer,
    CalendarSystemSerializer,
    CityListSerializer,
    CountryListSerializer,
    CountrySerializer,
    CurrencySerializer,
    LanguageSerializer,
    ProvinceListSerializer,
    ProvinceSerializer,
    TimezoneSerializer,
    UserLocalePreferenceSerializer,
)
from .services import LocalizationService


class CountryViewSet(viewsets.ReadOnlyModelViewSet):
    """لیست کشورها — فقط خواندنی."""
    queryset = Country.objects.filter(is_active=True)
    permission_classes = [permissions.AllowAny]

    def get_serializer_class(self):
        if self.action == 'list':
            return CountryListSerializer
        return CountrySerializer

    @action(detail=True, methods=['get'], url_path='provinces')
    def provinces(self, request, pk=None):
        """لیست استان‌های یک کشور."""
        country = self.get_object()
        provinces = Province.objects.filter(country=country)
        serializer = ProvinceListSerializer(provinces, many=True)
        return Response({'data': serializer.data})


class ProvinceViewSet(viewsets.ReadOnlyModelViewSet):
    """لیست استان‌ها — فقط خواندنی."""
    queryset = Province.objects.all()
    serializer_class = ProvinceSerializer
    permission_classes = [permissions.AllowAny]

    @action(detail=True, methods=['get'], url_path='cities')
    def cities(self, request, pk=None):
        """لیست شهرهای یک استان."""
        province = self.get_object()
        cities = City.objects.filter(province=province)
        serializer = CityListSerializer(cities, many=True)
        return Response({'data': serializer.data})


class LanguageViewSet(viewsets.ReadOnlyModelViewSet):
    """لیست زبان‌ها — فقط خواندنی."""
    queryset = Language.objects.filter(is_active=True)
    serializer_class = LanguageSerializer
    permission_classes = [permissions.AllowAny]


class CurrencyViewSet(viewsets.ReadOnlyModelViewSet):
    """لیست ارزها — فقط خواندنی."""
    queryset = Currency.objects.filter(is_active=True)
    serializer_class = CurrencySerializer
    permission_classes = [permissions.AllowAny]


class TimezoneViewSet(viewsets.ReadOnlyModelViewSet):
    """لیست مناطق زمانی — فقط خواندنی."""
    queryset = Timezone.objects.all()
    serializer_class = TimezoneSerializer
    permission_classes = [permissions.AllowAny]


class CalendarSystemViewSet(viewsets.ReadOnlyModelViewSet):
    """لیست تقویم‌ها — فقط خواندنی."""
    queryset = CalendarSystem.objects.all()
    serializer_class = CalendarSystemSerializer
    permission_classes = [permissions.AllowAny]


class UserLocalePreferenceView(APIView):
    """تنظیمات locale کاربر — GET/PUT."""
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        try:
            pref = request.user.locale_preference
            serializer = UserLocalePreferenceSerializer(pref)
            return Response({'data': serializer.data})
        except UserLocalePreference.DoesNotExist:
            return Response({'data': None})

    def put(self, request):
        try:
            pref = request.user.locale_preference
            serializer = UserLocalePreferenceSerializer(
                pref, data=request.data, partial=True, context={'request': request}
            )
        except UserLocalePreference.DoesNotExist:
            serializer = UserLocalePreferenceSerializer(
                data=request.data, context={'request': request}
            )

        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({'data': serializer.data})


class ActiveLocaleView(APIView):
    """locale فعال — ترکیب User + Tenant + Platform defaults."""
    permission_classes = [permissions.AllowAny]

    def get(self, request):
        user = request.user if request.user.is_authenticated else None
        tenant = getattr(request, 'tenant', None)
        locale_data = LocalizationService.get_active_locale(
            user=user, tenant=tenant
        )
        serializer = ActiveLocaleSerializer(locale_data)
        return Response({'data': serializer.data})
