from django.contrib.auth.password_validation import validate_password
from django.contrib.auth.forms import UserCreationForm
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError
from django.contrib import messages
from django import forms
from .models import NelUser


class RegistrationForm(UserCreationForm):
    class Meta:
        model = NelUser
        fields = (NelUser.EMAIL_FIELD,)


class ChangePasswordForm(forms.Form):
    current_password = forms.CharField(
        label=_('current_password'),
        widget=forms.PasswordInput
    )
    new_password = forms.CharField(
        label=_('new_password'),
        widget=forms.PasswordInput
    )
    new_password_confirm = forms.CharField(
        label=_('new_password_confirm'),
        widget=forms.PasswordInput
    )

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        return super().__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super().clean()
        old_pass = cleaned_data.get('current_password')
        new_pass = cleaned_data.get('new_password')
        new_pass_confirm = cleaned_data.get('new_password_confirm')
        user = self.request.user
        if new_pass != new_pass_confirm:
            msg = _('The new password does not match its confirmation.')
            raise forms.ValidationError(msg)
        try:
            validate_password(new_pass, user=user)
        except ValidationError as error:
            raise forms.ValidationError(error)
        if not user.check_password(old_pass):
            msg = _('The current password is incorrect.')
            raise forms.ValidationError(msg)


class DeleteAccountForm(forms.Form):
    current_password = forms.CharField(
        label=_('current_password'),
        widget=forms.PasswordInput
    )

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        return super().__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get('current_password')
        user = self.request.user
        if not user.check_password(password):
            msg = _('The current password is incorrect.')
            raise forms.ValidationError(msg)