from flask_wtf import Form
from flask_login import current_user
from wtforms import StringField, PasswordField, TextAreaField, BooleanField
from wtforms.validators import DataRequired, Email, Length, EqualTo, Regexp, NumberRange, ValidationError

from models import User


def name_exists(form, field):
    if User.select().where(User.username==field.data).exists():
        raise ValidationError("Username has already been taken.")

def email_exists(form, field):
    if User.select().where(User.email==field.data).exists():
        raise ValidationError("Email has already been registered.")


def name_change_check(form, field):
    if field.data and User.select().where( (User.username==field.data) & (User.id != current_user.id)   ).exists():
        raise ValidationError("Username taken.")

def email_change_check(form, field):
    if field.data and User.select().where( (User.email==field.data) & (User.id != current_user.id)  ).exists():
        raise ValidationError("Email taken.")


class RegisterForm(Form):
    username = StringField(
        'Username',
        validators=[
            DataRequired(), 
            Regexp(
                r'^[a-zA-Z0-9_]+
, 
                message="Username can only contain letters, numbers and underscores."
                ),
                name_exists
        ])

    email = StringField(
        'Email',
        validators=[ DataRequired(), Email(), email_exists ]
        )

    password = PasswordField(
        'Password',
        validators=[ 
            DataRequired(), 
            Length(min=6, max=50, message="Password must be at least 6 characters long!"),
            EqualTo('password2', message="Passwords do not match!") 
        ])

    password2 = PasswordField(
        'Confirm',
        validators=[DataRequired()]
        )


class LoginForm(Form):
    username = StringField( 'Username', validators=[DataRequired()] )
    password = PasswordField( 'Password', validators=[DataRequired()] )


class MemoForm(Form):
    title = StringField('Day Title')
    content = TextAreaField('How did it go?')
    money_made = StringField( 'Income', validators=[Regexp(r'^[0-9]*
, message="Must be a number.")])
    foods = StringField( 'Foods', validators=[
                                    DataRequired(),
                                    Regexp(
                                            r'^([a-zA-Z0-9 ]+[,]?)+
,
                                            message="Food must contain letters and numbers only, each separated by one comma."
                                            )
                        ])
    activities = StringField( 'Activities', validators=[
                                    DataRequired(),
                                    Regexp(
                                            r'^([a-zA-Z0-9 ]+[,]?)+
,
                                            message="Activities must contain letters and numbers only, each separated by one comma."
                                            )
                        ])
    

class SettingsForm(Form):
    username = StringField(
        'Username',
        validators=[
            Regexp(
                r'^[a-zA-Z0-9_]*
,
                message="Username can only contain letters, numbers and underscores."
                ),
                name_change_check
        ])

    email = StringField(
        'Email',
        validators=[ Email(), email_change_check ]
        )
    
    password = PasswordField(
        'Old Password', 
        validators=[ 
            DataRequired()
        ])

    new_password = PasswordField(
        'New Password',
        validators=[ 
            Length(min=6, max=50, message="Password must be at least 6 characters long!"),
            EqualTo('confirm_password', message="Passwords do not match!") 
        ])

    confirm_password = PasswordField(
        'Confirm Password'
        )