from django.contrib.auth.models import User
from django.db.models import QuerySet, Sum
from django.http import HttpResponseRedirect
from django.shortcuts import render

# Create your views here.
from django.urls import reverse_lazy

from customrolepermissions.mixins import RequiredPermissionViewMixin, RequiredPermissionMixin
from customrolepermissions.permissions import has_permission_exactly
from financial.filters import TransactionListFilter
from financial.forms import TransactionCreateForm, TransactionCreateFormsetFactory
from financial.models import Transaction, Cashier
from financial.tables import TransactionListViewTable
from utils.views import GenericFilterListView, GenericInlineCreateView


class TransactionListView(RequiredPermissionViewMixin, GenericFilterListView):
    # required_permission__ = 'transactions__read'
    required_permission__all = 'transactions__read'
    model = Transaction
    table_class = TransactionListViewTable
    filterset_class = TransactionListFilter
    add_url = reverse_lazy('financial:transaction-create')
    ordering = ('-id',)
    page_header = 'تراکنش ها'

    def get_card_data(self):
        cards_data = []
        cashiers = Cashier.objects.filter(id__in=self.get_queryset().values_list('cashier__id', flat=True))
        for cashier_obj in cashiers:
            transactions = cashier_obj.transaction_set.all()
            result = ((transactions.aggregate(sum_receipt=Sum('receipt')).get('sum_receipt') or 0) -
                      (transactions.aggregate(sum_payment=Sum('payment')).get('sum_payment') or 0))
            cards_data.append({'name': f'{cashier_obj.name}',
                               'info': f'{result:,}',
                               'box_css_class': 'fw-bold'})

        query = self.filterset_class(self.request.GET, queryset=self.get_queryset())
        sums = query.queryset.aggregate(
            sum_payment=Sum('payment'), sum_receipt=Sum('receipt'),
        )
        sums_usdt = query.queryset.aggregate(
            sum_payment=Sum('usdt_payment'), sum_receipt=Sum('usdt_receipt'),
        )
        cards_data.append({'name': 'جمع پرداخت - usdt',
                           'info': f'{sums.get("sum_payment") or 0:,} - {sums_usdt.get("sum_payment") or 0:,.1f}',
                           'box_css_class': 'fw-bold'})
        cards_data.append({'name': 'جمع دریافت - usdt',
                           'info': f'{sums.get("sum_receipt") or 0:,} - {sums_usdt.get("sum_receipt") or 0:,.1f}',
                           'box_css_class': 'fw-bold'})
        return cards_data

    def get_queryset(self) -> QuerySet:
        if self.request.user.id not in [30, 4]:
            return super().get_queryset().filter(archived=False, creator=self.request.user)
        return super().get_queryset().filter(archived=False)

    def is_rel(self):
        return has_permission_exactly(self.request.user, self.required_permission__rel)


class TransactionCreateView(RequiredPermissionMixin, GenericInlineCreateView):
    # required_permission__all = 'transactions__create'
    required_permission__all = 'transactions__read'
    model = User
    back_url = reverse_lazy('financial:transaction-list')
    success_url = reverse_lazy('financial:transaction-list')
    page_header = 'Transaction Create'
    form_class = TransactionCreateForm
    inlines = [
        TransactionCreateFormsetFactory,
    ]
    inlines_names = [
        'transaction',
    ]

    def get_initial(self):
        initial = super().get_initial()
        user = self.request.user
        initial.update({
            'user': user,
        })
        return initial

    def forms_valid(self, form, inlines):
        for formset in inlines:
            formset.creator = self.request.user
            formset.save()
        return HttpResponseRedirect(self.get_success_url())