#

from django import forms
from django.conf import settings
from django.core.exceptions import ValidationError
from django.utils.functional import lazy
from django.utils.translation import get_language, gettext_lazy as _

from . import get_date_formats, start_of_day

fmt = get_date_formats()

MIN_DATE = getattr(settings, 'MIN_DATE', None)
MIN_DATETIME = start_of_day(MIN_DATE) if MIN_DATE else None


class DatePickerMedia:
    css = {
        'screen': [
            # 'vendor/air-datepicker/css/datepicker.min.css',
            'vendor/persian-datepicker/css/persian-datepicker.min.css',
        ],
    }
    js = [
        # 'vendor/air-datepicker/js/datepicker.min.js',
        # 'vendor/air-datepicker/js/i18n/datepicker.en.js',
        # 'vendor/air-datepicker/js/auto-datepicker.js',
        'vendor/persian-datepicker/js/persian-date.min.js',
        'vendor/persian-datepicker/js/persian-datepicker.min.js',
        'vendor/persian-datepicker/js/auto-persian-datepicker.js',
    ]


class DatePickerInput(forms.DateInput):
    class Media(DatePickerMedia):
        pass

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.attrs.update({
            'placeholder': fmt.DATE_PLACEHOLDER,
            'class': 'auto-datepicker',
            'data-date-format': fmt.DATE_INPUT_FORMAT,
            'data-auto-close': 'true',
            'data-first-day': 1,
            # 'data-language': lazy(lambda: get_language())(),
            'autocomplete': 'off',
        })
        if not self.attrs.get('data-language'):
            self.attrs.update({
                'data-language': 'gregorian',
            })


def validate_min_date(value):
    if value and value < MIN_DATE:
        raise ValidationError(_('Enter a valid date'), code='invalid')


def validate_min_datetime(value):
    if value and value < MIN_DATETIME:
        raise ValidationError(_('Enter a valid date'), code='invalid')


class DatePickerField(forms.DateField):
    widget = DatePickerInput
    default_validators = [validate_min_date] if MIN_DATE else []

    def __init__(self, *args, **kwargs):
        default_persian = kwargs.pop('default_persian', None)
        super().__init__(*args, **kwargs)
        if default_persian:
            self.widget.attrs.update({
                'data-language': 'persian',
            })
        if not self.required:
            self.widget.attrs.update({
                'data-clear-button': 'true',
            })


class DateTimePickerInput(forms.DateTimeInput):
    class Media(DatePickerMedia):
        pass

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.attrs.update({
            'placeholder': fmt.DATETIME_PLACEHOLDER,
            'class': 'auto-datepicker',
            'data-date-format': fmt.DATE_INPUT_FORMAT,
            'data-time-format': fmt.TIME_INPUT_FORMAT,
            'data-timepicker': 'true',
            'data-auto-close': 'true',
            'data-first-day': 1,
            # 'data-language': lazy(lambda: get_language())(),
            'autocomplete': 'off',
        })
        if not self.attrs.get('data-language'):
            self.attrs.update({
                'data-language': 'gregorian',
            })


class DateTimePickerField(forms.DateTimeField):
    widget = DateTimePickerInput
    default_validators = [validate_min_datetime] if MIN_DATE else []

    def __init__(self, *args, **kwargs):
        default_persian = kwargs.pop('default_persian', None)
        super().__init__(*args, **kwargs)
        if default_persian:
            self.widget.attrs.update({
                'data-leap-year-mode': 'astronomical', # 'algorithmic', 'astronomical'
                'data-language': 'persian',
            })
        if not self.required:
            self.widget.attrs.update({
                'data-clear-button': 'true',
            })
