"""
Формы, использующиеся в приложении.
"""
from django import forms
from django.contrib.auth.forms import AuthenticationForm
from django_registration.forms import RegistrationFormUniqueEmail

from main.models import UserProfile


class CustomRegistrationForm(RegistrationFormUniqueEmail):
    """
    Форма для регистрации :class:`django_registration.forms.RegistrationFormUniqueEmail`
    с добавлением bootstrap-класса "form-control".

    :param visible_fields.email: Поле для ввода email, зарегистрированного на Zendesk
    :type visible_fields.email: :class:`django_registration.forms.RegistrationFormUniqueEmail`
    """

    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        for visible in self.visible_fields():
            if visible.field.widget.attrs.get('class', False):
                if visible.field.widget.attrs['class'].find('form-control') < 0:
                    visible.field.widget.attrs['class'] += 'form-control'
            else:
                visible.field.widget.attrs['class'] = 'form-control'
            if visible.html_name != 'email':
                visible.field.required = False

    class Meta(RegistrationFormUniqueEmail.Meta):
        fields = RegistrationFormUniqueEmail.Meta.fields


class AdminPageUsers(forms.Form):
    """
    Форма для установки статусов engineer или light_agent пользователям.

    :param users: Поле для установки статуса
    :type users: :class:`ModelMultipleChoiceField`
    """

    users = forms.ModelMultipleChoiceField(
        queryset=UserProfile.objects.filter(role='agent'),
        widget=forms.CheckboxSelectMultiple(
            attrs={
                'class': 'form-check-input',

            }
        ),
        label=''
    )


class CustomAuthenticationForm(AuthenticationForm):
    """
    Форма для авторизации :class:`django.contrib.auth.forms.AuthenticationForm`
    с изменением поля username на email.

    :param username: Поле для ввода email пользователя
    :type username: :class:`django.forms.fields.CharField`
    :param error_messages: Список ошибок авторизации
    :type error_messages: :class:`dict`
    """
    username = forms.CharField(
        label="Электронная почта",
        widget=forms.EmailInput(),
    )
    error_messages = {
        'invalid_login':
            "Пожалуйста, введите правильные электронную почту и пароль. Оба поля "
            "могут быть чувствительны к регистру.",
        'inactive': "Аккаунт не активен.",
    }


INTERVAL_CHOICES = [
    ('days', 'Дни'),
    ('months', 'Месяцы')
]
DISPLAY_CHOICES = [
    ('hours', 'Часы'),
    ('days', 'Дни/Смены')
]


class StatisticForm(forms.Form):
    """
    Форма отображения интервалов работы пользователя.

    :param email: Поле для ввода email пользователя
    :type email: :class:`django.forms.fields.EmailField`
    :param interval: Расчет интервала рабочего времени
    :type interval: :class:`django.forms.fields.CharField`
    :param display_format: Формат отображения данных
    :type display_format: :class:`django.forms.fields.CharField`
    :param range_start: Дата и время начала работы
    :type range_start: :class:`django.forms.fields.DateField`
    :param range_end: Дата и время окончания работы
    :type range_end: :class:`django.forms.fields.DateField`
    """
    email = forms.EmailField(
        label='Электронная почта',
        widget=forms.EmailInput(
            attrs={
                'placeholder': 'example@ngenix.ru',
                'class': 'form-control',
            }
        ),
    )
    interval = forms.ChoiceField(
        label='Выберите интервалы времени работы',
        choices=INTERVAL_CHOICES,
        widget=forms.RadioSelect(
            attrs={
                'class': 'btn-check',
            }
        )
    )
    display_format = forms.ChoiceField(
        label='Выберите формат отображения',
        choices=DISPLAY_CHOICES,
        widget=forms.RadioSelect(
            attrs={
                'class': 'btn-check',
            }
        )
    )
    range_start = forms.DateField(
        label='Начало статистики',
        widget=forms.DateInput(
            attrs={
                'type': 'date',
                'class': 'btn btn-secondary text-primary bg-white',
            }
        ),
    )
    range_end = forms.DateField(
        label='Конец статистики',
        widget=forms.DateInput(
            attrs={
                'type': 'date',
                'class': 'btn btn-secondary text-primary bg-white',
            }
        ),
    )


class WorkGetTicketsForm(forms.Form):
    """
    Форма получения количества тикетов для страницы work и work_get_tickets.

    :param count_tickets: Поле для ввода количества тикетов
    :type count_tickets: :class:`django.forms.fields.IntegerField`
    """
    count_tickets = forms.IntegerField(
        min_value=0,
        max_value=100,
        required=True,
        widget=forms.NumberInput(
            attrs={
                'class': 'form-control mb-3',
                'value': 1
            }
        ),
    )
