from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField, TextAreaField, SelectField
from wtforms.validators import ValidationError, DataRequired, Email, EqualTo, Length
from app.models import User, Api


class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    remember_me = BooleanField('Remember Me')
    submit = SubmitField('Sign In')


class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    password2 = PasswordField(
        'Repeat Password', validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField('Register')

    def validate_username(self, username):
        user = User.query.filter_by(username=username.data).first()
        if user is not None:
            raise ValidationError('Please use a different username.')

    def validate_email(self, email):
        user = User.query.filter_by(email=email.data).first()
        if user is not None:
            raise ValidationError('Please use a different email address.')


class EditProfileForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    about_me = TextAreaField('About me', validators=[Length(min=0, max=140)])
    submit = SubmitField('Submit')

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

    def validate_username(self, username):
        if username.data != self.original_username:
            user = User.query.filter_by(username=self.username.data).first()
            if user is not None:
                raise ValidationError('Please use a different username.')


class ResetPasswordRequestForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    submit = SubmitField('Request Password Reset')


class ResetPasswordForm(FlaskForm):
    password = PasswordField('Password', validators=[DataRequired()])
    password2 = PasswordField(
        'Repeat Password', validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField('Request Password Reset')


class CreateAPI(FlaskForm):
    typeOptions = ['Get', 'Post', 'Put', 'Delete']
    apiname = StringField('API Name', validators=[DataRequired()])
    requesttype = SelectField(u'Request Type', choices=typeOptions, validators=[DataRequired()])
    apiurl = StringField('Request URL', validators=[DataRequired()])
    apidata = TextAreaField('Request Body')
    # defaultAPI = BooleanField('Sets API to run first')
    submit = SubmitField('Save')

    def validate_name(self, name):
        user = Api.query.filter_by(name=name.data).first()
        if user is not None:
            raise ValidationError('Name already used, please rename the API Request.')

    # def validate_apiurl(self, apiurl):
    #     user = Api.query.filter_by(apiurl=apiurl.data).first()
    #     if user is not None:
    #         raise ValidationError('Please use a different Request URL.')


class EditAPI(FlaskForm):
    typeOptions = ['Get', 'Post', 'Put', 'Delete']
    apiname = StringField('API Name', validators=[DataRequired()], render_kw={'readonly': True})
    requesttype = SelectField(u'Request Type', choices=typeOptions, validators=[DataRequired()])
    apiurl = StringField('Request URL', validators=[DataRequired()])
    apidata = TextAreaField('Request Body')
    submit = SubmitField('Save')

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

    def validate_name(self, name):
        user = Api.query.filter_by(name=name.data).first()
        if user is not None:
            raise ValidationError('Name already used, please rename the API Request.')