"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 22.07.21

"""
import django_filters
from django import forms
from django.contrib.auth.models import User
from django.db.models import QuerySet, Q

from django.utils.translation import gettext_lazy as _

from intervention.inputs import DummyFilterInput
from intervention.models import Intervention


class InterventionTableFilter(django_filters.FilterSet):
    """ TableFilter for Intervention model

    """
    sa = django_filters.BooleanFilter(
        method='_filter_show_all',
        label=_("Show unshared"),
        label_suffix=_(""),
        widget=forms.CheckboxInput()
    )
    q = django_filters.Filter(
        method='_filter_by_keyword',
        # Since we use a custom search bar in the template, we need to 'render' this filter
        # as 'anonymous' HiddenInput (no id, no name). This way our custom search bar's id and name won't be
        # overwritten with these id and name (which would be equal)
        # This way we can use the simple filter method mapping for a parameter without using a predefined widget!
        widget=DummyFilterInput(),
    )
    sr = django_filters.BooleanFilter(
        method='_filter_show_recorded',
        label=_("Show recorded"),
        label_suffix=_(""),
        widget=forms.CheckboxInput()
    )
    # Gemarkung ##ToDo
    g = django_filters.CharFilter(
        field_name="name",
        lookup_expr="icontains",
        label=_(""),
        label_suffix=_(""),
        widget=forms.TextInput(
            attrs={
                "placeholder": _("District"),
                "title": _("Search for district")
            }
        ),
    )
    # Kreis
    ## ToDo
    # Flur
    ## ToDo
    # Zähler
    ## ToDo
    # Nenner
    ## ToDo

    class Meta:
        model = Intervention
        fields = []

    def __init__(self, user: User, *args, **kwargs):
        self.user = user
        super().__init__(*args, **kwargs)

    def _filter_by_keyword(self, queryset, name, value) -> QuerySet:
        """ Filters queryset depending on value of search bar input

        Args:
            queryset ():
            name ():
            value ():

        Returns:

        """
        value = value.strip()
        # build filter expression
        q = Q(title__icontains=value) | Q(identifier__icontains=value)
        return queryset.filter(q)

    def _filter_show_all(self, queryset, name, value) -> QuerySet:
        """ Filters queryset depending on value of 'show_all' setting

        Args:
            queryset ():
            name ():
            value ():

        Returns:

        """
        if not value:
            return queryset.filter(
                users__in=[self.user],  # requesting user has access
            )
        else:
            return queryset

    def _filter_show_recorded(self, queryset, name, value) -> QuerySet:
        """ Filters queryset depending on value of 'show_recorded' setting

        Args:
            queryset ():
            name ():
            value ():

        Returns:

        """
        if not value:
            return queryset.filter(
                recorded=None,
            )
        else:
            return queryset