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


class AddCorpusFileForm(FlaskForm):
    author = StringField('Author', validators=[DataRequired(), Length(1, 64)])
    file = FileField('File', validators=[DataRequired()])
    publishing_year = IntegerField('Publishing year',
                                   validators=[DataRequired()])
    submit = SubmitField()
    title = StringField('Title', validators=[DataRequired(), Length(1, 64)])

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


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


class EditCorpusFileForm(FlaskForm):
    author = StringField('Author', validators=[DataRequired(), Length(1, 64)])
    corpus_file_id = IntegerField('', validators=[DataRequired()])
    publishing_year = IntegerField('Publishing year',
                                   validators=[DataRequired()])
    submit = SubmitField()
    title = StringField('Title', validators=[DataRequired(), Length(1, 64)])


class QueryForm(FlaskForm):
    query = TextAreaField('CQP 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')],
                                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')],
                            validators=[DataRequired()])