# coding: utf-8
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField, HiddenField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from flask_login import current_user
from webinterface.models.system import Persona, Correo
import pwnedpasswords

class LoginForm(FlaskForm):
    login = StringField('Rut', validators=[DataRequired()])
    clave = PasswordField('Clave', validators=[DataRequired()])
    remember = BooleanField('Recordarme')
    submit = SubmitField('Ingresar')


class RequestResetForm(FlaskForm):
    correo = StringField('Correo',
                        validators=[DataRequired(), Email()])
    submit = SubmitField(u'Solicitud de recuperación de clave')


class ResetPasswordForm(FlaskForm):
    password = PasswordField('Ingresa una Clave de Acceso', validators=[DataRequired()])
    confirm_password = PasswordField(u'Confirma tu Clave',
                                     validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField(u'Actualizar Contraseña')

    def validate_password(self, clave):
        if pwnedpasswords.check(clave.data):
            raise ValidationError(u'La Clave ingresada es insegura. Verifíquelo en <a href="https://haveibeenpwned.com/Passwords">\';--have i been pwned?</a>')


class RegistrationForm(FlaskForm):
    login = StringField('Usuario',
                           validators=[DataRequired(), Length(min=2, max=20)])
    email = StringField('Correo',
                        validators=[DataRequired(), Email()])
    password = PasswordField('Clave', validators=[DataRequired()])
    confirm_password = PasswordField('Confirma clave',
                                     validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField('Registrar')

    def validate_login(self, login):
        user = Persona.query.filter_by(login=login.data).first()
        if user:
            raise ValidationError(u'El nombre de usuario ya existe, elige otro por favor.')

    def validate_email(self, email):
        correo = Correo.query.filter_by(correo=email.data).first()
        if correo:
            raise ValidationError(u'El correo electrónico ya exite. ¿Olvidaste tu clave?')

    def validate_password(self, clave):
        if pwnedpasswords.check(clave.data):
            raise ValidationError(u'La clave ingresada es insegura. Verifíquelo en <a href="https://haveibeenpwned.com/Passwords">\';--have i been pwned?</a>')


class mMiCuenta(FlaskForm):
    id      = HiddenField()
    login   = StringField('Usuario', render_kw={'readonly': True})
    nombrecompleto  = StringField('Nombre', render_kw={'readonly': True})


    correo  = StringField('Correo Principal', validators=[DataRequired(), Email()])
    clave   = PasswordField('Clave')
    fono   = StringField('Telefono', render_kw={"placeholder": "+569 8765 4321"})

    submit = SubmitField('Modificar')

    def validate_fono(self, field):
        parsed = field.data.replace(" ", "")

        if not parsed:
            raise ValidationError(u'Debe ingresar un número de teléfono.')
        if not parsed.startswith('+'):
            raise ValidationError(u'Ingrese el número completo "+569XYZWABCD".')
        if len(parsed) < 11:
            raise ValidationError(u'Ingrese el número completo "+569XYZWABCD".')
        if not parsed[1:].isdigit():
            raise ValidationError(u'El número ingresado no es válido, contiene caracteres no-numéricos.')

    def validate_clave(self, field):
        if field.data and pwnedpasswords.check(field.data):
            raise ValidationError(u'La clave ingresada es insegura. Verifíque la seguridad de su clave en <a href="https://haveibeenpwned.com/Passwords" target="_blank">\';--have i been pwned?</a>')
