from flask import current_app
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired
from wtforms import (
    BooleanField,
    StringField,
    SubmitField,
    SelectMultipleField,
    IntegerField,
    ValidationError
)
from wtforms.validators import InputRequired, Length
from app.services import SERVICES


class ContributionBaseForm(FlaskForm):
    title = StringField(
        'Title',
        validators=[InputRequired(), Length(max=64)]
    )
    description = StringField(
        'Description',
        validators=[InputRequired(), Length(max=255)]
    )
    version = StringField(
        'Version',
        validators=[InputRequired(), Length(max=16)]
    )
    publisher = StringField(
        'Publisher',
        validators=[InputRequired(), Length(max=128)]
    )
    publisher_url = StringField(
        'Publisher URL',
        validators=[InputRequired(), Length(max=512)]
    )
    publishing_url = StringField(
        'Publishing URL',
        validators=[InputRequired(), Length(max=512)]
    )
    publishing_year = IntegerField(
        'Publishing year',
        validators=[InputRequired()]
    )
    compatible_service_versions = SelectMultipleField(
        'Compatible service versions'
    )
    submit = SubmitField()


class CreateTesseractOCRPipelineModelForm(ContributionBaseForm):
    tesseract_model_file = FileField(
        'File',
        validators=[FileRequired()]
    )
    
    def validate_tesseract_model_file(self, field):
        if not field.data.filename.lower().endswith('.traineddata'):
            raise ValidationError('traineddata files only!')

    def __init__(self, *args, **kwargs):
        service_manifest = SERVICES['tesseract-ocr-pipeline']
        super().__init__(*args, **kwargs)
        self.compatible_service_versions.choices = [('', 'Choose your option')]
        self.compatible_service_versions.choices += [
            (x, x) for x in service_manifest['versions'].keys()
        ]
        self.compatible_service_versions.default = ''


class CreateSpaCyNLPPipelineModelForm(ContributionBaseForm):
    spacy_model_file = FileField(
        'File',
        validators=[FileRequired()]
    )
    pipeline_name = StringField(
        'Pipeline name',
        validators=[InputRequired(), Length(max=64)]
    )

    def validate_spacy_model_file(self, field):
        if not field.data.filename.lower().endswith('.tar.gz'):
            raise ValidationError('.tar.gz files only!')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        service_manifest = SERVICES['spacy-nlp-pipeline']
        self.compatible_service_versions.choices = [('', 'Choose your option')]
        self.compatible_service_versions.choices += [
            (x, x) for x in service_manifest['versions'].keys()
        ]
        self.compatible_service_versions.default = ''


class EditContributionBaseForm(ContributionBaseForm):
    pass

class EditTesseractOCRPipelineModelForm(EditContributionBaseForm):
    def __init__(self, *args, **kwargs):
        service_manifest = SERVICES['tesseract-ocr-pipeline']
        super().__init__(*args, **kwargs)
        self.compatible_service_versions.choices = [('', 'Choose your option')]
        self.compatible_service_versions.choices += [
            (x, x) for x in service_manifest['versions'].keys()
        ]
        self.compatible_service_versions.default = ''


class EditSpaCyNLPPipelineModelForm(EditContributionBaseForm):
    pipeline_name = StringField(
        'Pipeline name',
        validators=[InputRequired(), Length(max=64)]
    )
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        service_manifest = SERVICES['spacy-nlp-pipeline']
        self.compatible_service_versions.choices = [('', 'Choose your option')]
        self.compatible_service_versions.choices += [
            (x, x) for x in service_manifest['versions'].keys()
        ]
        self.compatible_service_versions.default = ''
