"""
This module defines operating system user related forms.

"""
from __future__ import unicode_literals

from django import forms
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit

from .models import User

PASSWORD_MISMATCH_ERROR = _("Passwords don't match")
"""
Error message for non matching passwords.
"""


class ChangeOsUserPasswordForm(forms.ModelForm):
    """
    A form for setting an OS user's password.

    """
    password1 = forms.CharField(
        label=_('Password'), widget=forms.PasswordInput,
        required=False,
    )
    password2 = forms.CharField(
        label=_('Password (again)'), widget=forms.PasswordInput,
        required=False,
    )

    class Meta:
        model = User
        fields = []

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        super(ChangeOsUserPasswordForm, self).__init__(*args, **kwargs)
        self.helper.form_action = reverse(
            'set_osuser_password', kwargs={'slug': self.instance.username})
        self.helper.add_input(Submit('submit', _('Set password')))

    def clean_password2(self):
        """
        Check that the two password entries match.

        :return: the validated password
        :rtype: str or None

        """
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError(PASSWORD_MISMATCH_ERROR)
        return password2

    def save(self, commit=True):
        """
        Save the provided password in hashed format.

        :param boolean commit: whether to save the created user
        :return: user instance
        :rtype: :py:class:`osusers.models.User`

        """
        self.instance.set_password(self.cleaned_data['password1'])
        return super(ChangeOsUserPasswordForm, self).save(commit=commit)