from datetime import time
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, TimeField, SubmitField
from wtforms.validators import ValidationError
from app.models.planfix_models import PlanfixToken


class PlanfixSettingsForm(FlaskForm):
    api_login  = StringField("API-login")
    api_token  = PasswordField("API-token")
    run_time   = TimeField("Час запуску", format="%H:%M", default=time(3, 0))

    submit_save = SubmitField("Зберегти")
    submit_test = SubmitField("Тест підключення")
    submit_run  = SubmitField("Запустити зараз")

    # ---------------------- init -----------------------------------------
    def __init__(self, obj: PlanfixToken | None = None, *args, **kwargs):
        """
        • При GET-запросе (когда formdata пустой) заполняем форму значениями из БД.
        • При POST-запросе ничего не трогаем – WTForms уже проставил данные,
          введённые пользователем.
        """
        super().__init__(*args, **kwargs)
        self._existing = obj

        # placeholder для токена – это можно делать всегда
        if obj:
            self.api_token.render_kw = {"placeholder": "збережено"}


        if obj and not self.is_submitted():
            # api_login хотим показывать и при GET
            self.api_login.data = obj.api_login

            try:
                m, h, *_ = obj.cron_expr.split()
                self.run_time.data = time(int(h), int(m))
            except ValueError:
                self.run_time.data = time(0, 0)

    # ---------------------- validation -----------------------------------
    def validate_api_login(self, fld):
        if self.submit_save.data and not fld.data and not self._existing:
            raise ValidationError("API-login обовʼязковий")

    def validate_api_token(self, fld):
        if self.submit_save.data and not fld.data and not self._existing:
            raise ValidationError("API-token обовʼязковий")
