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


class AddCorpusFileForm(FlaskForm):
    address = StringField('Adress', validators=[Length(0, 255)])
    author = StringField('Author', validators=[DataRequired(), Length(1, 255)])
    booktitle = StringField('Booktitle', validators=[Length(0, 255)])
    chapter = StringField('Chapter', validators=[Length(0, 255)])
    editor = StringField('Editor', validators=[Length(0, 255)])
    file = FileField('File', validators=[DataRequired()])
    institution = StringField('Institution', validators=[Length(0, 255)])
    journal = StringField('Journal', validators=[Length(0, 255)])
    pages = StringField('Pages', validators=[Length(0, 255)])
    publisher = StringField('Publisher', validators=[Length(0, 255)])
    publishing_year = IntegerField('Publishing year', validators=[DataRequired()])
    school = StringField('School', validators=[Length(0, 255)])
    submit = SubmitField()
    title = StringField('Title', validators=[DataRequired(), Length(1, 255)])

    def validate_file(form, field):
        if not field.data.filename.lower().endswith('.vrt'):
            raise ValidationError('File does not have an approved extension: '
                                  '.vrt')


class AddCorpusForm(FlaskForm):
    description = StringField('Description',
                              validators=[DataRequired(), Length(1, 255)])
    submit = SubmitField()
    title = StringField('Title', validators=[DataRequired(), Length(1, 32)])


class EditCorpusFileForm(FlaskForm):
    address = StringField('Adress', validators=[Length(0, 255)])
    author = StringField('Author', validators=[DataRequired(), Length(1, 255)])
    booktitle = StringField('Booktitle', validators=[Length(0, 255)])
    chapter = StringField('Chapter', validators=[Length(0, 255)])
    editor = StringField('Editor', validators=[Length(0, 255)])
    institution = StringField('Institution', validators=[Length(0, 255)])
    journal = StringField('Journal', validators=[Length(0, 255)])
    pages = StringField('Pages', validators=[Length(0, 255)])
    publisher = StringField('Publisher', validators=[Length(0, 255)])
    publishing_year = IntegerField('Publishing year', validators=[DataRequired()])
    school = StringField('School', validators=[Length(0, 255)])
    submit = SubmitField()
    title = StringField('Title', validators=[DataRequired(), Length(1, 255)])


class QueryForm(FlaskForm):
    expert_mode = BooleanField('Expert mode')
    query = StringField('Query',
                        validators=[DataRequired(), Length(1, 1024)])
    hits_per_page = SelectField('Hits per page',
                                choices=[('', 'Nr. of hits per page'),
                                         ('10', '10'),
                                         ('20', '20'),
                                         ('30', '30'),
                                         ('40', '40'),
                                         ('50', '50'),
                                         ('60', '60'),
                                         ('70', '70'),
                                         ('80', '80'),
                                         ('90', '90'),
                                         ('100', '100')],
                                validators=[DataRequired()])
    context = SelectField('Context',
                          choices=[('', 'Words of context around hit'),
                                   ('5', '5'),
                                   ('10', '10'),
                                   ('15', '15'),
                                   ('20', '20'),
                                   ('25', '25')],
                          validators=[DataRequired()])
    submit = SubmitField('Start Query')


class QueryDownloadForm(FlaskForm):
    file_type = SelectField('File type',
                            choices=[('', 'Choose file type'),
                                     ('csv', 'csv'),
                                     ('json', 'json'),
                                     ('excel', 'excel'),
                                     ('html', 'html-table')],
                            validators=[DataRequired()])
