from django import forms
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from usercontrol.models import UserProfile
from django.core.validators import validate_email
from django.utils.translation import ugettext as _

class RegistrationForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField()

    fbid = forms.CharField(required=False)
    first_name = forms.CharField(required=False)
    last_name = forms.CharField(required=False)
    img = forms.CharField(required=False)
    fbfirstname = forms.CharField(required=False)
    fblastname = forms.CharField(required=False)
    fbname = forms.CharField(required=False)
    fbusername = forms.CharField(required=False)
    signed_request = forms.CharField(required=False)


    def clean_fbid(self):
        try:
            fbid = self.cleaned_data['fbid']
            return fbid
        except:
            return False

    def clean_signed_request(self):
        return self.cleaned_data['signed_request']

    def clean_first_name(self):
        return self.cleaned_data['first_name']

    def clean_last_name(self):
        return self.cleaned_data['last_name']

    def clean_img(self):
        return self.cleaned_data['img']

    def clean_username(self):
        username = self.cleaned_data['username'].lower()
        validate_email(username)
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(_('%s  уже используется.' % username))

    def clean_password(self):
        password = self.cleaned_data['password']
        if len(password) < 6:
            raise forms.ValidationError(_('6 символов минимум'))
        elif len(password) > 64:
            raise forms.ValidationError(_('64 символов максимум'))
        else:
            return password

    def clean(self):
        return self.cleaned_data


class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField()
    fbfirstname = forms.CharField(required=False)
    fblastname = forms.CharField(required=False)
    remember_me = forms.BooleanField(required=False)
    fbusername = forms.CharField(required=False)
    signed_request = forms.CharField(required=False)

    def clean_signed_request(self):
        return self.cleaned_data['signed_request']

    def clean_username(self):
        username = self.cleaned_data['username'].lower()
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            raise forms.ValidationError(_('%s не зарегистрирован.' % username))
        return username

    def clean_password(self):
        password = self.cleaned_data['password']
        if password == 'nopassword':
            return False
        try:
            username = self.cleaned_data['username'].lower()
        except KeyError:
            return password

        try_auth = authenticate(username=username, password=password)
        if try_auth:
            return password
        else:
            raise forms.ValidationError(_('Пароль неверный для %s' % username))

    def clean_remember_me(self):
        remember_me = self.cleaned_data['remember_me']
        return remember_me


class PasswordRecover(forms.Form):
    username = forms.CharField()

    def clean_username(self):
        username = self.cleaned_data['username'].lower()
        try:
            User.objects.get(username=username).profile.password_recovery_key
        except User.DoesNotExist:
            raise forms.ValidationError(_('%s не зарегистрирован.' % username))
        return username


class ProfileForm(forms.Form):
    username = forms.CharField()
    first_name = forms.CharField()
    age = forms.IntegerField(required=False)
    last_name = forms.CharField(required=False)
    country = forms.CharField(required=False)
    city = forms.CharField(required=False)
    address = forms.CharField(required=False)
    phone = forms.CharField(required=False)
    additional_phone = forms.CharField(required=False)

    company_name = forms.CharField(required=False)

    new_password = forms.CharField(required=False)
    password = forms.CharField(required=False)

    class Meta:
        model = UserProfile

    # it gives self.user.variables to form class
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(ProfileForm, self).__init__(*args, **kwargs)

    def clean_username(self):
        username = self.cleaned_data.get('username').lower()
        if username == self.user.username:
            return username
        if username and User.objects.filter(username=username).count():
            raise forms.ValidationError(_('%s уже используется.' % username))
        return username

    def clean_company_name(self):
        company_name = self.cleaned_data['company_name']
        if len(company_name) <= 64:
            return company_name
        else:
            raise forms.ValidationError(_('Incorrect'))

    def clean_phone(self):
        phone = self.cleaned_data['phone']
        return phone

    def clean_real_mail(self):
        real_mail = self.cleaned_data['real_mail']
        return real_mail

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

    def clean_password(self):
        try:
            if self.cleaned_data['username'].lower() != self.user.username or self.cleaned_data['new_password']:
                try_auth = authenticate(username=self.user.username, password=self.cleaned_data['password'])
                if try_auth:
                    pass
                else:
                    raise forms.ValidationError(_('Неверный пароль'))
        except KeyError:
            pass


class ChangePasswordWQ(forms.Form):
    new_password = forms.CharField()

    def clean_new_password(self):
        new_password = self.cleaned_data['new_password']
        if 6 <= len(new_password) <= 64:
            return new_password

        raise forms.ValidationError('System error #382')

class ChangePassword(forms.Form):
    username = forms.CharField()
    oldpass = forms.CharField(required=True)
    new_password = forms.CharField(required=True)

    def clean_oldpass(self):
        return self.cleaned_data['oldpass']

    def clean_username(self):
        return self.cleaned_data['username']

    def clean_new_password(self):
        new_password = self.cleaned_data['new_password']
        try_username = self.cleaned_data['username']
        try_password = self.cleaned_data.get('oldpass')
        from django.contrib.auth import authenticate
        try_auth = authenticate(username=try_username, password=try_password)
        if try_auth is None:
            raise forms.ValidationError(_('Неверный текущий пароль.'))
        if 6 <= len(new_password):
            return new_password
        else:
            raise forms.ValidationError(_('Введите хотя бы 6 символов.'))
