from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField, SelectField
from wtforms.validators import DataRequired, NumberRange, Regexp, Length


class PolicerForm(FlaskForm):
    policer_name = StringField(
        "Policer Name",
        validators=[
            DataRequired(),
            Length(max=63),
            Regexp(r"^[A-Za-z0-9_-]+$", message="Only letters, numbers, hyphens and underscores allowed."),
        ],
    )
    bandwidth_value = IntegerField("Bandwidth Limit", validators=[DataRequired(), NumberRange(min=1)])
    bandwidth_unit = SelectField(
        "Bandwidth Unit",
        choices=[("k", "Kbps"), ("m", "Mbps"), ("g", "Gbps")],
        default="m",
    )
    burst_value = IntegerField("Burst Size Limit", validators=[DataRequired(), NumberRange(min=1)])
    burst_unit = SelectField(
        "Burst Unit",
        choices=[("k", "KB"), ("m", "MB")],
        default="k",
    )
    then_action = SelectField(
        "When Exceeded",
        choices=[
            ("discard", "Discard exceeding traffic"),
            ("loss_priority_high", "Mark loss-priority high (don't discard)"),
        ],
        default="discard",
    )
    interface = StringField("Interface", validators=[DataRequired(), Length(max=64)])
    unit = IntegerField("Logical Unit", default=0, validators=[NumberRange(min=0)])
    direction = SelectField(
        "Direction",
        choices=[("input", "Input (ingress)"), ("output", "Output (egress)")],
        default="input",
    )
