import django_filters
from django import forms
from django.contrib.auth.models import User as django_user
from django.utils import timezone
from unidecode import unidecode

from accounts.models import CloseWebAppSnipes, Console, CloseWebAppTransfers
from sniper import crispy_layouts
from sniper.models import DischargeMode2, DischargePerDay
from utils.date_utils.filters import DateTimePickerFilter
from utils.select2_form_fields import Select2Widget


class DischargeWithSnipeLogListFilter(django_filters.FilterSet):
    previous_console = django_filters.ModelChoiceFilter(
        field_name='previous_console_name',
        queryset=Console.objects.all().order_by('name'),
        label='Previous Console',
        method='previous_console_name__equal',
        widget=Select2Widget,
    )
    investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        label='Investor',
        method='investor__equal',
        widget=Select2Widget,
    )
    exclude_investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        label='Exc-Investor',
        method='investor__not_equal',
        widget=Select2Widget,
    )

    start_date = DateTimePickerFilter(required=False, label='Start Date', field_name='insert_time',
                                      method='start_time_filter')
    end_date = DateTimePickerFilter(required=False, label='End Date', field_name='insert_time',
                                    method='end_time_filter')

    def previous_console_name__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(first_account__previous_console__name=value)
            # queryset = queryset.filter(first_account__console__in=value)
        return queryset

    def investor__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(first_account__previous_console__investor=value)
        return queryset

    def investor__not_equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.exclude(first_account__console__investor=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 = CloseWebAppSnipes
        fields = ['previous_console', 'investor', 'exclude_investor']

        class form(forms.Form):
            helper = crispy_layouts.DischargeWithSnipeLogListFilterHelper()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form.initial['start_date'] = timezone.localtime() - timezone.timedelta(days=1)
        self.form.initial['end_date'] = timezone.localtime()


class DischargeMode2LogListFilter(django_filters.FilterSet):
    f_a_user_name = django_filters.CharFilter(field_name='fifa_account__user_name', lookup_expr='icontains', label='User Name')
    current_console = django_filters.ModelChoiceFilter(
        field_name='fifa_account__console', lookup_expr='exact',
        queryset=Console.objects.all().order_by('name'),
        label='Console',
        # method='previous_console__equal',
        widget=Select2Widget,
    )
    previous_console = django_filters.ModelChoiceFilter(
        field_name='fifa_account__previous_console', lookup_expr='exact',
        queryset=Console.objects.all().order_by('name'),
        label='Previous Console',
        # method='previous_console__equal',
        widget=Select2Widget,
    )
    investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        label='Investor',
        method='investor__equal',
        widget=Select2Widget,
    )
    exclude_investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        label='Exc-Investor',
        method='investor__not_equal',
        widget=Select2Widget,
    )

    start_date = DateTimePickerFilter(required=False, label='Start Date', field_name='create_time',
                                      method='start_time_filter')
    end_date = DateTimePickerFilter(required=False, label='End Date', field_name='create_time',
                                    method='end_time_filter')

    def previous_console_name__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(fifa_account__previous_console__name=value)
            # queryset = queryset.filter(fifa_account__console__in=value)
        return queryset

    def investor__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(fifa_account__previous_console__investor=value)
        return queryset

    def investor__not_equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.exclude(fifa_account__console__investor=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 = DischargeMode2
        fields = ['f_a_user_name', 'current_console', 'previous_console',
                  'investor', 'exclude_investor', 'mule__site_name']

        class form(forms.Form):
            helper = crispy_layouts.DischargeWithMode2FilterHelper()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form.initial['start_date'] = timezone.localtime() - timezone.timedelta(days=1)
        self.form.initial['end_date'] = timezone.localtime()


class DischargePerDayLogListFilter(django_filters.FilterSet):
    previous_console = django_filters.ModelChoiceFilter(
        field_name='previous_console_name',
        queryset=Console.objects.all().order_by('name'),
        label='Previous Console',
        method='previous_console_name__equal',
        widget=Select2Widget,
    )
    investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        label='Investor',
        method='investor__equal',
        widget=Select2Widget,
    )
    exclude_investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        label='Exc-Investor',
        method='investor__not_equal',
        widget=Select2Widget,
    )

    start_date = DateTimePickerFilter(required=False, label='Start Date', field_name='create_time',
                                      method='start_time_filter')
    end_date = DateTimePickerFilter(required=False, label='End Date', field_name='create_time',
                                    method='end_time_filter')

    def previous_console_name__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(fifa_account__previous_console__name=value)
            # queryset = queryset.filter(fifa_account__console__in=value)
        return queryset

    def investor__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(fifa_account__previous_console__investor=value)
        return queryset

    def investor__not_equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.exclude(fifa_account__console__investor=value)
        return queryset

    def start_time_filter(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(**{f'{name}__gt': unidecode(value)})
        return queryset

    def end_time_filter(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(**{f'{name}__lt': unidecode(value)})
        return queryset

    class Meta:
        model = DischargePerDay
        fields = ['previous_console', 'investor', 'exclude_investor']

        class form(forms.Form):
            helper = crispy_layouts.DischargeWithSnipeLogListFilterHelper()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form.initial['start_date'] = timezone.localtime() - timezone.timedelta(days=1)
        self.form.initial['end_date'] = timezone.localtime()


class DischargeMode3LogListFilter(django_filters.FilterSet):
    f_s_user_name = django_filters.CharFilter(
        field_name='second_account__user_name',
        lookup_expr='icontains',
        label='User Name',
    )
    current_console = django_filters.ModelChoiceFilter(
        field_name='second_account__console', lookup_expr='exact',
        queryset=Console.objects.all().order_by('name'),
        label='Console',
        # method='previous_console__equal',
        widget=Select2Widget,
    )
    previous_console = django_filters.ModelChoiceFilter(
        field_name='second_account__previous_console', lookup_expr='exact',
        queryset=Console.objects.all().order_by('name'),
        label='Previous Console',
        # method='previous_console__equal',
        widget=Select2Widget,
    )
    investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        label='Investor',
        method='investor__equal',
        widget=Select2Widget,
    )
    exclude_investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        label='Exc-Investor',
        method='investor__not_equal',
        widget=Select2Widget,
    )

    start_date = DateTimePickerFilter(required=False, label='Start Date', field_name='create_time',
                                      method='start_time_filter')
    end_date = DateTimePickerFilter(required=False, label='End Date', field_name='create_time',
                                    method='end_time_filter')
    status_filter = django_filters.BooleanFilter(required=False, label='Status', field_name='second_side_done')

    def previous_console_name__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(second_account__previous_console__name=value)
            # queryset = queryset.filter(fifa_account__console__in=value)
        return queryset

    def investor__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(second_account__previous_console__investor=value)
        return queryset

    def investor__not_equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.exclude(second_account__console__investor=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 = CloseWebAppTransfers
        fields = ['f_s_user_name', 'current_console', 'previous_console', 'investor', 'exclude_investor', 'status_filter']

        class form(forms.Form):
            helper = crispy_layouts.DischargeWithMode3FilterHelper()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form.initial['start_date'] = timezone.localtime() - timezone.timedelta(days=1)
        self.form.initial['end_date'] = timezone.localtime()