import hashlib
from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
from misago.forms import Form
from misago.users.models import User
from misago.users.validators import validate_password, validate_email

class CredentialsChangeForm(Form):
    new_email = forms.EmailField(max_length=255, required=False)
    new_password = forms.CharField(max_length=255, widget=forms.PasswordInput, required=False)
    current_password = forms.CharField(max_length=255, widget=forms.PasswordInput)

    layout = [
              (
               None,
               [
                ('new_email', {'label': _('New E-mail'), 'help_text': _("Enter new e-mail address or leave this field empty if you want only to change your password.")}),
                ('new_password', {'label': _('New Password'), 'help_text': _("Enter new password or leave this empty if you only want to change your e-mail address.")}),
                ('current_password', {'label': _('Current Password'), 'help_text': _("Confirm changes by entering new password.")})
                ]
               ),
              ]

    def clean_new_email(self):
        if self.cleaned_data['new_email']:
            new_hash = hashlib.md5(self.cleaned_data['new_email'].lower()).hexdigest()
            if new_hash == self.request.user.email_hash:
                raise ValidationError(_("New e-mail is same as your current e-mail."))
            try:
                User.objects.get(email_hash=new_hash)
                raise ValidationError(_("New e-mail address is already in use by other member."))
            except User.DoesNotExist:
                pass
            validate_email(self.cleaned_data['new_email'])
        return self.cleaned_data['new_email'].lower()

    def clean_new_password(self):
        if self.cleaned_data['new_password']:
            validate_password(self.cleaned_data['new_password'])
        return self.cleaned_data['new_password']

    def clean_current_password(self):
        if not self.request.user.check_password(self.cleaned_data['current_password']):
            raise ValidationError(_("You have entered wrong password."))
        return ''

    def clean(self):
        cleaned_data = super(CredentialsChangeForm, self).clean()
        if not cleaned_data['new_email'] and not cleaned_data['new_password']:
            raise ValidationError(_("You have to enter either new e-mail address or new password."))
        return cleaned_data