from flask_wtf import FlaskForm
from wtforms import BooleanField, DateTimeLocalField, IntegerField, PasswordField, StringField, SubmitField, TextAreaField
from wtforms.validators import DataRequired, Length, NumberRange, Optional


class UnlockForm(FlaskForm):
    access_key = StringField("Purchased access key", validators=[DataRequired(), Length(max=255)])
    submit = SubmitField("Unlock")


class AdminLoginForm(FlaskForm):
    username = StringField("Username", validators=[DataRequired(), Length(max=80)])
    password = PasswordField("Password", validators=[DataRequired(), Length(max=255)])
    remember = BooleanField("Keep me signed in")
    submit = SubmitField("Sign in")


class BatchCreateForm(FlaskForm):
    name = StringField("Batch name", validators=[DataRequired(), Length(max=120)])
    description = TextAreaField("Description", validators=[Optional(), Length(max=2000)])
    credentials = TextAreaField(
        "Credentials (one APIKey:SecretNumber pair per line)",
        validators=[DataRequired(), Length(max=20000)],
    )
    key_count = IntegerField("How many customer keys to generate", validators=[DataRequired(), NumberRange(min=1, max=500)])
    expires_at = DateTimeLocalField(
        "Optional expiry",
        format="%Y-%m-%dT%H:%M",
        validators=[Optional()],
    )
    max_views = IntegerField("Optional max unlocks per key", validators=[Optional(), NumberRange(min=1, max=1000)])
    key_notes = StringField("Notes for this key batch", validators=[Optional(), Length(max=255)])
    submit = SubmitField("Create batch")


class GenerateKeysForm(FlaskForm):
    count = IntegerField("Extra keys to generate", validators=[DataRequired(), NumberRange(min=1, max=500)])
    expires_at = DateTimeLocalField(
        "Optional expiry",
        format="%Y-%m-%dT%H:%M",
        validators=[Optional()],
    )
    max_views = IntegerField("Optional max unlocks per key", validators=[Optional(), NumberRange(min=1, max=1000)])
    key_notes = StringField("Notes", validators=[Optional(), Length(max=255)])
    submit = SubmitField("Generate keys")


class EmptyForm(FlaskForm):
    submit = SubmitField("Submit")
