import django_filters
from django import forms
from django.db import models
from django.db.models import F, ExpressionWrapper, Value
from django.db.models.functions import Concat, Cast

from financial import crispy_layouts
from financial.consts import TransactionPaymentType
from financial.models import Transaction, Cashier, AccountingHeadings, CostCenter
from utils.date_utils.filters import DateTimePickerFilter
from utils.select2_form_fields import Select2Widget


class TransactionListFilter(django_filters.FilterSet):
    # payment_type = django_filters.ChoiceFilter(choices=TransactionPaymentType, widget=Select2Widget)
    beneficiary = django_filters.CharFilter(
        label='ذینفع',
        field_name='beneficiary',
        lookup_expr='icontains',
    )
    cashier = django_filters.ChoiceFilter(
        label='صندوق',
        choices=Cashier.objects.all().values_list('id', 'name'),
        widget=Select2Widget,
        # method='cashier__equal'
    )
    accounting_headings = django_filters.ChoiceFilter(
        label='سرفصل',
        choices=AccountingHeadings.objects.all().values_list('id', 'name'),
        widget=Select2Widget,
        # method='accounting_headings__equal'
    )
    cost_center = django_filters.ChoiceFilter(
        label='مرکز هزینه',
        choices=CostCenter.objects.all().values_list('id', 'name'),
        widget=Select2Widget,
        # method='cost_center__equal'
    )
    start_date = DateTimePickerFilter(required=False, label='Start Date', field_name='transaction_date',
                                      method='start_time_filter')
    end_date = DateTimePickerFilter(required=False, label='End Date', field_name='transaction_date',
                                    method='end_time_filter')

    # def cashier__equal(self, queryset, name, value, *args, **kwargs):
    #     if value:
    #         queryset = queryset.filter(cashier__name=value)
    #     return queryset
    #
    # def accounting_headings__equal(self, queryset, name, value, *args, **kwargs):
    #     if value:
    #         queryset = queryset.filter(accounting_headings__name=value)
    #     return queryset
    #
    # def cost_center__equal(self, queryset, name, value, *args, **kwargs):
    #     if value:
    #         queryset = queryset.filter(cost_center__name=value)
    #     return queryset
    def start_time_filter(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(**{f'{name}__gt': value})
        return queryset

    def end_time_filter(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(**{f'{name}__lt': value})
        return queryset

    class Meta:
        model = Transaction
        fields = ['cashier', 'beneficiary', 'accounting_headings', 'cost_center']

        class form(forms.Form):
            helper = crispy_layouts.TransactionListFilterFormHelper()
