from rest_framework import viewsets
from rest_framework.pagination import PageNumberPagination
from rest_framework.filters import SearchFilter
from django_filters import rest_framework as filters
from development.models import Development, DevelopmentTranslate, Currency, Flat, FlatTranslate
from .serializers import CurrencySerializer, DevelopmentListSerializer, FlatSerializer

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    max_page_size = 50

class CurrencyViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Currency.objects.all()
    serializer_class = CurrencySerializer
    pagination_class = StandardResultsSetPagination
    filter_backends = [SearchFilter]
    search_fields = ['name', 'code', 'symbol']

class DevelopmentFilter(filters.FilterSet):
    price_min = filters.NumberFilter(field_name="development__flats__base_price", lookup_expr='gte')
    price_max = filters.NumberFilter(field_name="development__flats__base_price", lookup_expr='lte')
    city = filters.CharFilter(field_name="development__city__slug")
    
    class Meta:
        model = DevelopmentTranslate
        fields = ['price_min', 'price_max', 'city']

class DevelopmentViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = DevelopmentListSerializer
    pagination_class = StandardResultsSetPagination
    filterset_class = DevelopmentFilter
    
    def get_queryset(self):
        language = self.request.query_params.get('language', 'en')
        return DevelopmentTranslate.objects.select_related(
            'development',
            'development__city',
            'development__country'
        ).filter(
            development__is_active=True,
            development__is_deleted=False,
            language__code=language
        )

class FlatViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = FlatSerializer
    pagination_class = StandardResultsSetPagination
    
    def get_queryset(self):
        language = self.request.query_params.get('language', 'en')
        return FlatTranslate.objects.select_related(
            'flat',
            'flat__development'
        ).filter(
            flat__development__is_active=True,
            language__code=language
        )
