"""WTF Forms for ScoDoc
"""

import re
from flask_wtf import FlaskForm
from wtforms import StringField, validators


class ScoDocForm(FlaskForm):
    """Super class for ScoDoc forms
    (inspired by @iziram)
    """

    def __init__(self, *args, **kwargs):
        "Init form, adding a filed for our error messages"
        super().__init__(*args, **kwargs)
        self.ok = True
        self.error_messages: list[str] = []  # used to report our errors

    def set_error(self, err_msg, field=None):
        "Set error message both in form and field"
        self.ok = False
        self.error_messages.append(err_msg)
        if field:
            field.errors.append(err_msg)


class ScoDateField(StringField):
    """A WTF field for date, using datepicker"""

    def __init__(self, label: str, field_id: str, *args, **kwargs):
        render_kw = {
            "class": "datepicker",
            "size": 10,
            "id": field_id,
        }
        if "render_kw" in kwargs:
            render_kw.update(kwargs["render_kw"])
        super().__init__(
            label,
            validators=[validators.Length(max=10)],
            render_kw=render_kw,
            *args,
            **kwargs
        )


class ScoTimeField(StringField):
    """A WTF field for time, accept 12:34, 12h34, 12H34
    Uses timepicker
    """

    def __init__(self, label: str, field_id: str, *args, **kwargs):
        render_kw = {
            "class": "timepicker",
            "size": 5,
            "id": field_id,
        }
        if "render_kw" in kwargs:
            render_kw.update(kwargs["render_kw"])
        super().__init__(
            label,
            validators=[validators.Length(max=5)],
            default="",
            render_kw=render_kw,
            filters=[
                lambda x: (
                    re.sub(r"(^\d{2})[hH](\d{2}$)", r"\1:\2", x.strip()) if x else None
                )
            ],
            *args,
            **kwargs
        )