# shop_management/views/data/advance.py
from rest_framework.permissions import IsAuthenticated
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.models.data.advance import Advance
from shop_management.serializers.data.advance import AdvanceSerializer
from shop_management.views.data.pagination import CustomPagination
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from django.utils.dateparse import parse_date
from shop_management.models.data.account_transaction import AccountTransaction


class AdvanceViewSet(DataRootViewSet):
    serializer_class = AdvanceSerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "advance"
    pagination_class = CustomPagination
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ["shop", "employee", "year", "month"]
    search_fields = ["employee__name", "notes"]

    def get_queryset(self):
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            queryset = Advance.objects.all()
        else:
            queryset = Advance.objects.filter(get_user_data_filter(self.request.user, "employee__shop")).distinct()

        start_date = self.request.query_params.get("start_date")
        end_date = self.request.query_params.get("end_date")

        if start_date:
            start_date = parse_date(start_date)
            if start_date:
                queryset = queryset.filter(payment_date__date__gte=start_date)

        if end_date:
            end_date = parse_date(end_date)
            if end_date:
                queryset = queryset.filter(payment_date__date__lte=end_date)

        shop = self.request.query_params.get("shop")
        if shop:
            queryset = queryset.filter(employee__shop_id=shop)

        return queryset.order_by("-id")

    def perform_destroy(self, instance):
        AccountTransaction.objects.filter(
            description__startswith=f"Advance #{instance.id}"
        ).delete()
        super().perform_destroy(instance)
