from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed, FileRequired, FileSize
from wtforms import validators
from wtforms.validators import (
    Length,
    NumberRange,
    DataRequired,
    ValidationError,
)
from wtforms import (
    SubmitField,
    StringField,
    IntegerField,
    SelectField,
)


class UploadForm(FlaskForm):
    """File upload class for a new site in distribusi-verse"""

    def distribusiname(form, field):
        if field.data.lower() == "new":
            raise ValidationError("Name has to be unique and not just new.")

    sitename = StringField(
        "Name of your website:",
        validators=[validators.InputRequired(), Length(2, 100), distribusiname],
    )
    academicyear = SelectField(
        "Academic year:",
        validate_choice=True,
        coerce=str,
        choices=[
            (u'2021-2022', u'2021-2022'),
            (u'2022-2023', u'2022-2023'),
            (u'2023-2024', u'2023-2024'),
            (u'2024-2025', u'2024-2025'),
            (u'2020-2021', u'past: 2020-2021'),
        ],
        option_widget=None,
        validators=[DataRequired()]
    )
    term = SelectField(
        "Term:",
        validate_choice=True,
        coerce=str,
        choices=[
            (u'1.2', u'1.2'),
            (u'2.3', u'2.3'),
            (u'3.1', u'3.1'),
            (u'4.1', u'4.1'),
            (u'4.2', u'4.2'),
        ],
        option_widget=None,
        validators=[DataRequired()]
    )
    tags = StringField(
        "Add tags, press enter or add a comma after each tag:",
        validators=[validators.InputRequired(), Length(2, 500)],
    )

    course = SelectField(
        u'Course:',
        validate_choice=True,
        coerce=str,
        choices=[
            ('hacking', u'Autonomous - Hacking'),
            ('digitalcraft', u'Autonomous - Digital Craft'),
            ('criticalstudies', u'Autonomous - Critical Studies'),
            ('publicprivate', u'Autonomous - Public&Private'),
        ],
        option_widget=None,
        validators=[DataRequired()]
    )

    zipfile = FileField(
        "Upload your zip file with content here:",
        validators=[
            FileAllowed(["zip"], "Zip archives only!"),
            FileRequired(),
            FileSize(
                max_size=104857600,
                message="Zipfile size must be smaller than 100MB",
            ),
        ],
    )

    submit = SubmitField("Upload")