from flask_wtf import FlaskForm
from wtforms import (BooleanField, MultipleFileField, SelectField, StringField,
                     SubmitField, ValidationError)
from wtforms.validators import DataRequired, Length


class AddNLPJobForm(FlaskForm):
    description = StringField('Description',
                              validators=[DataRequired(), Length(1, 255)])
    files = MultipleFileField('Files', validators=[DataRequired()])
    language = SelectField('Language',
                           choices=[('', 'Choose your option'),
                                    ('nl', 'Dutch'),
                                    ('en', 'English'),
                                    ('fr', 'French'),
                                    ('de', 'German'),
                                    ('el', 'Greek'),
                                    ('it', 'Italian'),
                                    ('pt', 'Portuguese'),
                                    ('es', 'Spanish')],
                           validators=[DataRequired()])
    submit = SubmitField()
    title = StringField('Title', validators=[DataRequired(), Length(1, 32)])
    version = SelectField('Version',
                          choices=[('2.2.0', 'Latest (2.2.0)'),
                                   ('2.2.0', '2.2.0')],
                          validators=[DataRequired()])
    check_encoding = BooleanField('Check encoding')

    def validate_files(form, field):
        for file in field.data:
            if not file.filename.lower().endswith('.txt'):
                raise ValidationError('File does not have an approved '
                                      'extension: .txt')


class AddOCRJobForm(FlaskForm):
    binarization = BooleanField('Binarazation')
    description = StringField('Description',
                              validators=[DataRequired(), Length(1, 255)])
    files = MultipleFileField('Files', validators=[DataRequired()])
    language = SelectField('Language',
                           choices=[('', 'Choose your option'),
                                    ('eng', 'English'),
                                    ('enm', 'English, Middle (1100-1500)'),
                                    ('fra', 'French'),
                                    ('frm', 'French, Middle (ca. 1400-1600)'),
                                    ('deu', 'German'),
                                    ('frk', 'German Fraktur'),
                                    ('ita', 'Italian'),
                                    ('por', 'Portuguese'),
                                    ('spa', 'Spanish; Castilian')],
                           validators=[DataRequired()])
    split = BooleanField('Split')
    submit = SubmitField()
    title = StringField('Title', validators=[DataRequired(), Length(1, 32)])
    version = SelectField('Version',
                          choices=[('latest', 'Latest')],
                          validators=[DataRequired()])

    def validate_files(form, field):
        for file in field.data:
            if not file.filename.lower().endswith(('.pdf', '.tif', '.tiff')):
                raise ValidationError('File does not have an approved '
                                      'extension: .pdf | .tif | .tiff')


class AddSetupFilesJobForm(FlaskForm):
    description = StringField('Description',
                              validators=[DataRequired(), Length(1, 255)])
    submit = SubmitField()
    title = StringField('Title', validators=[DataRequired(), Length(1, 32)])
    files = MultipleFileField('Files', validators=[DataRequired()])
    version = SelectField('Version',
                          choices=[('latest', 'Latest')],
                          validators=[DataRequired()])

    def validate_files(form, field):
        for file in field.data:
            if not file.filename.lower().endswith(('.jpeg', '.jpg', '.png',
                                                   '.tiff', '.tif')):
                raise ValidationError('File does not have an approved '
                                      'extension: .jpeg | .jpg | .png | .tiff '
                                      '| .tif')
