# -*- coding: utf-8 -*-
from flask.ext.wtf import Form
from flask.ext.wtf.html5 import EmailField, IntegerField
from wtforms import PasswordField, TextField, BooleanField, SelectField, SubmitField, ValidationError
from wtforms.validators import Required, Length, EqualTo, Email
from project.application.entities.academic_years.constants import DEGREE_TYPE_SELECT
from project.application.entities.students.model import Student
from project.application.entities.users.model import User


class CreateStudentForm(Form):
    email = EmailField(u'Email студента', [Required(), Email()])
    password = PasswordField(u'Пароль', [Required(), Length(8, 100)], description=u'%s символов или больше' % 8)
    record_book_id = TextField(u'Номер зачетной книжки', [Required()])
    first_name = TextField(u'Имя')
    last_name = TextField(u'Фамилия')
    middle_name = TextField(u'Отчество')
    group = IntegerField(u'Номер группы ')
    information = TextField(u'Дополнительная информация')
    enter_year = IntegerField(u'Год поступления')
    taken_stop_out = BooleanField(u'Находится в академическом отпуске')
    degree = SelectField(u'Степень', choices=DEGREE_TYPE_SELECT, coerce=int)
    submit = SubmitField(u'Создать студента')

    def __init__(self, *args, **kwargs):
        Form.__init__(self, *args, **kwargs)

    def validate(self):
        if not Form.validate(self):
            return False
        if User.query.filter_by(email=self.email.data).first() is not None:
            raise ValidationError(u'Пользователь с таким email адресом уже существует!')
        elif Student.query.filter_by(record_book_id=self.record_book_id.data).first() is not None:
            raise ValidationError(u'Стедент с таким номером зачетной книжки уже существует!')
        else:
            return True


class UpdateStudentForm(Form):
    email = EmailField(u'Email студента', [Required(), Email()])
    password = PasswordField(u'Пароль', [Required(), Length(8, 100)], description=u'%s символов или больше' % 8)
    record_book_id = TextField(u'Номер зачетной книжки', [Required()])
    first_name = TextField(u'Имя')
    last_name = TextField(u'Фамилия')
    middle_name = TextField(u'Отчество')
    group = IntegerField(u'Номер группы ')
    information = TextField(u'Дополнительная информация')
    enter_year = IntegerField(u'Год поступления')
    taken_stop_out = BooleanField(u'Находится в академическом отпуске')
    degree = SelectField(u'Степень', choices=DEGREE_TYPE_SELECT, coerce=int)
    submit = SubmitField(u'Изменить студента')


class SetStudentForm(Form):
    student = SelectField(u'Выберите студента', validators=[Required()],
                          coerce=int)
    submit = SubmitField(u'Выбрать')
