from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, SelectField, DateField
from wtforms.validators import DataRequired, Length, ValidationError, Email, Optional
from minibase.database.models import Person
import minibase.database.utils as dbUtils


# Defines the form class to be used for the user registretion
class personForm(FlaskForm):
    # Decalarion of the fields for the form and it's propereties
    name = StringField('Name', validators=[DataRequired(), Length(min=3, max=20)])
    last_name = StringField('Last Name', validators=[DataRequired(), Length(min=3, max=20)])
    date_of_birth = DateField('Birth Date')
    company = SelectField('Company', validators=[DataRequired()])
    competence = SelectField('Competence', validators=[DataRequired()])
    role = SelectField('Role', validators=[DataRequired()])
    mail_prof = StringField('Email Professional', validators=[DataRequired(), Email()])
    mail_priv = StringField('Email Private', validators=[Optional(), Email()])
    tel_prof_fix = StringField('Tel Professional Fix', validators=[Optional()])
    tel_prof_mobile = StringField('Tel Professional Mob', validators=[Optional()])
    tel_priv_fix = StringField('Tel Private Fix', validators=[Optional()])
    tel_priv_mobile = StringField('Tel Private Mob', validators=[Optional()])
    submit = SubmitField('Register Person')

    # Queries to be made in order to validate the form : If person with this  name exitst within the same company
    # Case Insensistive
    def validate_person(self):
        person_query = Person.query.filter(Person.name.ilike(self.name.data))  # Database Querry ilike means case insessitive
        for person in person_query:
            if person.name:
                if person.last_name.lower() == self.last_name.data.lower():
                    if person.company == self.company.data:
                        raise ValidationError('This person working in this company already exist')