from flask_wtf import FlaskForm
from wtforms import (
    BooleanField,
    FileField,
    PasswordField,
    SelectField,
    StringField,
    SubmitField,
    TextAreaField,
    ValidationError
)
from wtforms.validators import (
    DataRequired,
    InputRequired,
    Email,
    EqualTo,
    Length,
    Regexp
)
from app.models import User, UserSettingJobStatusMailNotificationLevel
from app.auth import USERNAME_REGEX


class ChangePasswordForm(FlaskForm):
    password = PasswordField('Old password', validators=[DataRequired()])
    new_password = PasswordField(
        'New password',
        validators=[
            DataRequired(),
            EqualTo('new_password_2', message='Passwords must match')
        ]
    )
    new_password_2 = PasswordField(
        'New password confirmation',
        validators=[
            DataRequired(),
            EqualTo('new_password', message='Passwords must match')
        ]
    )
    submit = SubmitField()

    def __init__(self, user, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user = user

    def validate_current_password(self, field):
        if not self.user.verify_password(field.data):
            raise ValidationError('Invalid password')

class EditNotificationSettingsForm(FlaskForm):
    job_status_mail_notification_level = SelectField(
        'Job status mail notification level',
        choices=[('', 'Choose your option')],
        validators=[DataRequired()]
    )
    submit = SubmitField()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.job_status_mail_notification_level.choices += [
            (x.name, x.name.capitalize())
            for x in UserSettingJobStatusMailNotificationLevel
        ]

