from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
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.views.data.pagination import CustomPagination
from shop_management.models.data.purchase_payment import PurchasePayment
from shop_management.models.data.account_transaction import AccountTransaction
from shop_management.serializers.data.purchase_payment import PurchasePaymentSerializer

class PurchasePaymentViewSet(DataRootViewSet):
    serializer_class = PurchasePaymentSerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "purchase_payments"
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ["purchase", "purchase__shop", "account", "currency"]
    search_fields = [
        "purchase__shop__name",
        "purchase__supplier__name",
        "account__name",
        "notes",
    ]
    pagination_class = CustomPagination

    def get_queryset(self):
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            return PurchasePayment.objects.select_related(
                "purchase",
                "purchase__shop",
                "purchase__supplier",
                "currency",
                "account",
                "account__currency",
            ).order_by("-id")
        return PurchasePayment.objects.select_related(
            "purchase",
            "purchase__shop",
            "purchase__supplier",
            "currency",
            "account",
            "account__currency",
        ).filter(purchase__shop__owner=self.request.user).order_by("-id")

    def perform_destroy(self, instance):
        AccountTransaction.objects.filter(
            transaction_type="debit",
            description__startswith=f"Purchase payment #{instance.id} ",
        ).delete()
        super().perform_destroy(instance)
