"""Carga de relojes Anviz desde relojes.json."""

from __future__ import annotations

import json
from dataclasses import dataclass
from pathlib import Path

from app.config import settings


@dataclass(frozen=True)
class RelojConfig:
    id: str
    name: str
    host: str
    port: int
    device_id: int
    comm_password: str | None = None
    enabled: bool = True


def _config_path() -> Path:
    return Path(settings.RELOJES_CONFIG)


def load_relojes() -> list[RelojConfig]:
    path = _config_path()
    if not path.exists():
        raise FileNotFoundError(
            f"No existe {path}. Copie relojes.json.example a relojes.json y configure los 3 relojes."
        )
    raw = json.loads(path.read_text(encoding="utf-8"))
    if not isinstance(raw, list) or len(raw) == 0:
        raise ValueError("relojes.json debe ser una lista con al menos un reloj")

    relojes: list[RelojConfig] = []
    seen: set[str] = set()
    for item in raw:
        rid = str(item["id"]).strip()
        if rid in seen:
            raise ValueError(f"ID de reloj duplicado: {rid}")
        seen.add(rid)
        comm_pw = item.get("comm_password", settings.ANVIZ_COMM_PASSWORD)
        if comm_pw is not None:
            comm_pw = str(comm_pw).strip() or None

        relojes.append(
            RelojConfig(
                id=rid,
                name=str(item.get("name", rid)),
                host=str(item["host"]),
                port=int(item.get("port", 5010)),
                device_id=int(item["device_id"]),
                comm_password=comm_pw,
                enabled=bool(item.get("enabled", True)),
            )
        )
    return relojes


def get_reloj(reloj_id: str) -> RelojConfig:
    for r in load_relojes():
        if r.id == reloj_id:
            return r
    raise KeyError(f"Reloj no configurado: {reloj_id}")
