from __future__ import annotations

import os
from dataclasses import dataclass

from src.errors import UserError

SLUG_MAX_LEN_ENV_VAR = "SLUG_MAX_LEN"
PRIVACY_VENUE_DENYLIST_ENV_VAR = "PRIVACY_VENUE_DENYLIST"

DEFAULT_PRIVACY_DENYLIST = [
    "school",
    "basisschool",
    "kind",
    "kinder",
]


@dataclass(frozen=True)
class NamingConfig:
    slug_max_len: int
    denylist_terms: list[str]


def load_naming_config() -> NamingConfig:
    slug_max_len = _load_positive_int(SLUG_MAX_LEN_ENV_VAR, default=80)
    denylist_terms = _load_denylist_terms()
    return NamingConfig(slug_max_len=slug_max_len, denylist_terms=denylist_terms)


def _load_positive_int(name: str, *, default: int) -> int:
    raw = os.environ.get(name, "").strip()
    if not raw:
        return default
    try:
        value = int(raw)
    except ValueError as exc:
        raise UserError(f"Invalid {name}: expected integer, got {raw!r}") from exc
    if value <= 0:
        raise UserError(f"Invalid {name}: must be > 0 (got {value})")
    return value


def _load_denylist_terms() -> list[str]:
    raw = os.environ.get(PRIVACY_VENUE_DENYLIST_ENV_VAR, "").strip()
    if not raw:
        return list(DEFAULT_PRIVACY_DENYLIST)
    parts = [p.strip().lower() for p in raw.split(",")]
    return [p for p in parts if p]
