from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, TextAreaField, SubmitField, DecimalField, SelectField
from wtforms.fields.html5 import DateField, EmailField
from wtforms.validators import DataRequired, InputRequired, Optional, Email, EqualTo
from flask_wtf.file import FileField  # Cuz' wtforms' FileField is shitty
from app.models.trophies import Trophy
import app.utils.validators as vd


class RegistrationForm(FlaskForm):
    username = StringField(
        'Pseudonyme',
        description='Ce nom est définitif !',
        validators=[
            DataRequired(),
            vd.name_valid,
            vd.name_available,
        ],
    )
    email = EmailField(
        'Adresse Email',
        validators=[
            DataRequired(),
            Email(message="Adresse email invalide."),
            vd.email,
        ],
    )
    password = PasswordField(
        'Mot de passe',
        validators=[
            DataRequired(),
            vd.password,
       ],
    )
    password2 = PasswordField(
        'Répéter le mot de passe',
        validators=[
            DataRequired(),
            EqualTo('password', message="Les mots de passe doivent être identiques."),
        ],
    )
    guidelines = BooleanField(
        """J'accepte les <a href="#">CGU</a>""",
        validators=[
            DataRequired(),
        ],
    )
    newsletter = BooleanField(
        'Inscription à la newsletter',
        description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.',
    )
    submit = SubmitField(
        "S'inscrire",
    )


class UpdateAccountForm(FlaskForm):
    avatar = FileField(
        'Avatar',
        validators=[
            Optional(),
            vd.avatar,
        ],
    )
    email = EmailField(
        'Adresse email',
        validators=[
            Optional(),
            Email(message="Addresse email invalide."),
            vd.email,
            vd.old_password,
        ],
    )
    password = PasswordField(
        'Mot de passe',
        validators=[
            Optional(),
            vd.password,
            vd.old_password,
        ],
    )
    password2 = PasswordField(
        'Répéter le mot de passe',
        validators=[
            Optional(),
            EqualTo('password', message="Les mots de passe doivent être identiques."),
        ],
    )
    old_password = PasswordField(
        'Mot de passe actuel',
        validators=[
            Optional(),
        ],
    )
    birthday = DateField(
        'Anniversaire',
        validators=[
            Optional(),
        ],
    )
    signature = TextAreaField(
        'Signature',
        validators=[
            Optional(),
        ]
    )
    biography = TextAreaField(
        'Présentation',
        validators=[
            Optional(),
        ]
    )
    newsletter = BooleanField(
        'Inscription à la newsletter',
        description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.',
    )
    submit = SubmitField('Mettre à jour')


class DeleteAccountForm(FlaskForm):
    delete = BooleanField(
        'Confirmer la suppression',
        validators=[
            DataRequired(),
        ],
        description='Attention, cette opération est irréversible !'
    )
    old_password = PasswordField(
        'Mot de passe',
        validators=[
            DataRequired(),
            vd.old_password,
        ],
    )
    submit = SubmitField(
        'Supprimer le compte',
    )


class AdminUpdateAccountForm(FlaskForm):
    username = StringField(
        'Pseudonyme',
        validators=[
            Optional(),
            vd.name_valid,
        ],
    )
    avatar = FileField(
        'Avatar',
        validators=[
            Optional(),
            vd.avatar,
        ],
    )
    email = EmailField(
        'Adresse email',
        validators=[
            Optional(),
            Email(message="Addresse email invalide."),
            vd.email,
        ],
    )
    email_validate = BooleanField(
        "Envoyer un email de validation à la nouvelle adresse",
        description="Si décoché, l'utilisateur devra demander explicitement un email "\
            "de validation, ou faire valider son adresse email par un administrateur.",
    )
    password = PasswordField(
        'Mot de passe',
        description="L'ancien mot de passe ne pourra pas être récupéré !",
        validators=[
            Optional(),
            vd.password,
        ],
    )
    xp = DecimalField(
        'XP',
        validators=[
            Optional(),
        ]
    )
    birthday = DateField(
        'Anniversaire',
        validators=[
            Optional(),
        ],
    )
    signature = TextAreaField(
        'Signature',
        validators=[
            Optional(),
        ],
    )
    biography = TextAreaField(
        'Présentation',
        validators=[
            Optional(),
        ],
    )
    newsletter = BooleanField(
        'Inscription à la newsletter',
        description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.',
    )
    submit = SubmitField(
        'Mettre à jour',
    )


class AdminAccountEditTrophyForm(FlaskForm):
    # Boolean inputs are generated on-the-fly from trophy list
    submit = SubmitField(
        'Modifier',
    )


class AdminDeleteAccountForm(FlaskForm):
    delete = BooleanField(
        'Confirmer la suppression',
        validators=[
            DataRequired(),
        ],
        description='Attention, cette opération est irréversible !',
    )
    submit = SubmitField(
        'Supprimer le compte',
    )
