from rest_framework.permissions import IsAuthenticated
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from account.permissions import (
    HasTabPermission,
    user_can_see_all_shop_data,
    get_user_data_filter,
)
from shop_management.views.data.base import DataRootViewSet
from shop_management.views.data.pagination import CustomPagination
from shop_management.serializers.data.utils import (
    Unit,
    Currency,
    ExchangeRate,
    UnitSerializer,
    CurrencySerializer,
    ExchangeRateSerializer,
)

class UnitViewSet(DataRootViewSet):
    serializer_class = UnitSerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "units"
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ['title']
    pagination_class = CustomPagination

    def get_queryset(self):
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            return Unit.objects.all().order_by('-id')
        return Unit.objects.filter(get_user_data_filter(self.request.user, "shop")).distinct().order_by('-id')


class CurrencyViewSet(DataRootViewSet):
    serializer_class = CurrencySerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "currencies"
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ["title", "shop"]
    search_fields = ["title", "description", "shop__name"]
    pagination_class = CustomPagination

    def get_queryset(self):
        queryset = Currency.objects.select_related("shop")
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            return queryset.order_by('-id')
        return queryset.filter(
            get_user_data_filter(self.request.user, "shop")
        ).distinct().order_by('-id')


class ExchangeRateViewSet(DataRootViewSet):
    serializer_class = ExchangeRateSerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "exchange_rates"
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ["shop", "from_currency", "to_currency", "rate_date"]
    search_fields = ["from_currency__title", "to_currency__title", "shop__name"]
    pagination_class = CustomPagination

    def get_queryset(self):
        queryset = ExchangeRate.objects.select_related(
            "from_currency", "to_currency", "shop"
        )
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            return queryset.order_by("-rate_date", "-id")
        return queryset.filter(
            get_user_data_filter(self.request.user, "shop")
        ).distinct().order_by("-rate_date", "-id")
