from datetime import datetime, timedelta
from django.db.models import Q
from django.utils import timezone
from django.utils.dateparse import parse_date
from rest_framework.permissions import IsAuthenticated
from account.permissions import (
    HasTabPermission,
    user_can_see_all_shop_data,
    get_user_data_filter,
)
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from rest_framework import viewsets
from shop_management.models.data.customer_debtor import CustomerDebtor
from shop_management.models.data.account_transaction import AccountTransaction
from shop_management.serializers.data.customer_debtor import CustomerDebtorSerializer
from shop_management.views.data.pagination import CustomPagination


class CustomerDebtorViewSet(viewsets.ModelViewSet):
    serializer_class = CustomerDebtorSerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tabs = ["debtors", "customers", "reports"]
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ["customer", "customer__shop", "currency", "account"]
    search_fields = ["customer__name", "notes", "account__name"]
    pagination_class = CustomPagination

    def get_queryset(self):
        can_see_all = any(
            user_can_see_all_shop_data(self.request.user, t)
            for t in self.required_tabs
        )
        select = (
            "customer",
            "customer__shop",
            "currency",
            "account",
            "account__currency",
        )
        if can_see_all:
            queryset = CustomerDebtor.objects.all().select_related(*select)
        else:
            queryset = CustomerDebtor.objects.filter(
                get_user_data_filter(self.request.user, "customer__shop")
            ).select_related(*select)

        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:
                start_dt = timezone.make_aware(
                    datetime.combine(start_date, datetime.min.time()),
                    timezone.get_current_timezone(),
                )
                queryset = queryset.filter(loan_date__gte=start_dt)
        if end_date:
            end_date = parse_date(end_date)
            if end_date:
                end_dt = timezone.make_aware(
                    datetime.combine(end_date + timedelta(days=1), datetime.min.time()),
                    timezone.get_current_timezone(),
                )
                queryset = queryset.filter(loan_date__lt=end_dt)
        shop = self.request.query_params.get("shop")
        if shop:
            queryset = queryset.filter(customer__shop_id=shop)
        return queryset.order_by("-loan_date", "-id")

    def perform_destroy(self, instance):
        AccountTransaction.objects.filter(
            Q(description__startswith=f"Customer loan #{instance.id} ")
            | Q(description__startswith=f"Customer debtor #{instance.id} ")
        ).delete()
        super().perform_destroy(instance)
