import django_filters
from django import forms
from django.contrib.auth.models import User as django_user
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from accounts.models import Console, ConsoleLastStatus
from customrolepermissions.permissions import has_permission_exactly
from sbc import crispy_layouts
from sbc.models import SBCWorker
from utils.date_utils.filters import DateTimePickerFilter
from utils.filters_fields import get_boolean_filter
from utils.select2_form_fields import Select2Widget, Select2MultipleWidget


class SbcWorkersLogsFilter(django_filters.FilterSet):
    has_error = get_boolean_filter(label='Has Error', field_name='has_error')
    is_done = get_boolean_filter(label='Is Done', field_name='is_done')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.form.initial['is_done'] = False
        # self.form.initial['has_error'] = False

    class Meta:
        model = SBCWorker
        fields = ['has_error', 'is_done']

        class form(forms.Form):
            helper = crispy_layouts.SbcWorkersLogsFilterHelper()


class InvestorPageFilter(django_filters.FilterSet):
    investor = django_filters.ModelChoiceFilter(
        field_name='investor',
        queryset=django_user.objects.filter(user_permissions__codename='is_investor'),
        empty_label=_('All Investors'),
        label='Investor',
        widget=Select2Widget,
        method='investor__equal',
    )
    start_date = DateTimePickerFilter(required=False, label='Start Date', field_name='name', method='_fake_filter')
    end_date = DateTimePickerFilter(required=False, label='End Date', field_name='name', method='_fake_filter')

    def investor__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(console__investor=value)
        return queryset

    def _fake_filter(self, queryset, value, *args, **kwargs):
        # its not real filter. just created for params in url
        return queryset

    class Meta:
        model = Console
        fields = ['investor', 'start_date', 'end_date']

        class form(forms.Form):
            helper = crispy_layouts.InvestorPageFilterHelper()

    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 ConsoleWorkersLogsFilter(django_filters.FilterSet):
    exclude_investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.none(),
        label='Exc-Investor',
        method='investor__not_equal',
        widget=Select2Widget,
    )
    range_number = django_filters.RangeFilter(field_name='name', label='Console Name')

    def investor__not_equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.exclude(investor=value)
        return queryset

    class Meta:
        model = Console
        fields = ['exclude_investor', 'range_number']

        class form(forms.Form):
            helper = crispy_layouts.ConsoleWorkersLogsFilterHelper()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        request = kwargs.get('request')
        if request and has_permission_exactly(request.user, 'console_log__read__all'):
            self.form.fields['exclude_investor'].queryset = django_user.objects.filter(
                user_permissions__codename='is_investor')


class ConsoleWorkersLogs2Filter(django_filters.FilterSet):
    _status_choices = [[ii, ii] for ii in [
        'discharging 2 ...', 'discharging 3 ...',
        'Squad Battle End', 'clim objectives and milestones ...',
        'selling items ...', 'open packs',
        'Trade Start ...', 'Trade End',
        'all account is done', 'PC Turned off', 'PC is asleep', 'Console is asleep', 'Waiting for sbc',
        'Start Console Bots', 'Console Bot End',
        'can not connect to console',
        'verification done',
    ]]
    exclude_investor = django_filters.ModelChoiceFilter(
        queryset=django_user.objects.none(),
        label='Exc-Investor',
        method='investor__not_equal',
        widget=Select2Widget,
    )
    range_number = django_filters.RangeFilter(field_name='console__name', label='Console Name')
    exc_status = django_filters.MultipleChoiceFilter(
        label='Exc-Status',
        method='status__not_equal',
        widget=Select2MultipleWidget,
        choices=_status_choices,
    )
    inc_status = django_filters.MultipleChoiceFilter(
        label='Inc-Status',
        method='status__equal',
        widget=Select2MultipleWidget,
        choices=_status_choices,
    )

    def investor__not_equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.exclude(console__investor=value)
        return queryset

    def status__not_equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.exclude(status__in=value)
        return queryset

    def status__equal(self, queryset, name, value, *args, **kwargs):
        if value:
            queryset = queryset.filter(status__in=value)
        return queryset

    class Meta:
        model = ConsoleLastStatus
        fields = ['exclude_investor', 'range_number', 'exc_status', 'inc_status']

        class form(forms.Form):
            helper = crispy_layouts.ConsoleWorkersLogs2FilterHelper()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        request = kwargs.get('request')
        if request and has_permission_exactly(request.user, 'console_log__read__all'):
            self.form.fields['exclude_investor'].queryset = django_user.objects.filter(
                user_permissions__codename='is_investor')


class NationsFilter(django_filters.FilterSet):
    id_filter = django_filters.CharFilter(required=False, label='ID', field_name='id', method='_fake_filter')
    name_filter = django_filters.CharFilter(required=False, label='Name', field_name='name', method='_fake_filter')

    def _fake_filter(self, queryset, value, *args, **kwargs):
        # its not real filter. just created for params in url
        return queryset

    class Meta:
        model = Console
        fields = ['id_filter', 'name_filter']

        class form(forms.Form):
            helper = crispy_layouts.NationsFilterHelper()