from functools import lru_cache
from pathlib import Path

from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    """Настройки panel, всё через env с префиксом GHARD_ (см. .env.example)."""

    model_config = SettingsConfigDict(env_prefix="GHARD_", env_file=".env", extra="ignore")

    database_path: Path = Path("/data/hard-panel.db")
    # пусто = API панели открыт без авторизации (личная панель);
    # если задан — доступ только с Bearer-токеном (скрипты, MCP)
    admin_token: str = ""
    # gnexus-auth: задан client_id — браузерная авторизация через gnexus-auth
    # (OAuth PKCE + сессионная cookie); пусто — панель открыта, как выше
    auth_base_url: str = ""
    auth_client_id: str = ""
    auth_client_secret: str = ""
    auth_redirect_uri: str = ""
    auth_webhook_secret: str = ""
    # пусто = пропускаем любого залогиненного; через запятую — e-mail/user_id
    auth_allowlist: str = ""
    session_ttl_seconds: int = 7 * 24 * 3600
    # offline = нет данных дольше offline_multiplier * interval агента (сек)
    offline_multiplier: int = 3
    # как часто панель опрашивает сетевые хранилища (сек)
    share_interval: int = 60
    # как часто панель опрашивает health-эндпоинты сервисов (сек)
    health_interval: int = 30
    # таймаут одного health-запроса (сек)
    health_timeout: float = 5.0


@lru_cache
def get_settings() -> Settings:
    return Settings()