import os from dataclasses import dataclass from typing import List def _split_csv(value: str) -> List[str]: return [item.strip() for item in value.split(",") if item.strip()] @dataclass(frozen=True) class AppConfig: app_name: str database_path: str poll_interval_seconds: int scheduler_enabled: bool admin_token: str request_timeout_seconds: int proxmox_enabled: bool proxmox_endpoints: List[str] proxmox_token_id: str proxmox_token_secret: str proxmox_user: str proxmox_password: str proxmox_verify_tls: bool docker_enabled: bool docker_hosts: List[str] docker_bearer_token: str docker_agent_endpoints: List[str] docker_agent_token: str coolify_enabled: bool coolify_endpoints: List[str] coolify_api_token: str def _bool_env(name: str, default: bool) -> bool: value = os.getenv(name) if value is None: return default return value.strip().lower() in {"1", "true", "yes", "on"} def load_config() -> AppConfig: base_dir = os.getenv("BASE_DIR", os.getcwd()) os.makedirs(base_dir, exist_ok=True) docker_hosts = _split_csv(os.getenv("DOCKER_HOSTS", "")) if not docker_hosts: single_docker_host = os.getenv("DOCKER_HOST", "").strip() if single_docker_host: docker_hosts = [single_docker_host] return AppConfig( app_name=os.getenv("APP_NAME", "Home Lab Inventory"), database_path=os.getenv("DATABASE_PATH", os.path.join(base_dir, "inventory.db")), poll_interval_seconds=int(os.getenv("POLL_INTERVAL_SECONDS", "300")), scheduler_enabled=_bool_env("SCHEDULER_ENABLED", True), admin_token=os.getenv("ADMIN_TOKEN", ""), request_timeout_seconds=int(os.getenv("REQUEST_TIMEOUT_SECONDS", "10")), proxmox_enabled=_bool_env("PROXMOX_ENABLED", True), proxmox_endpoints=_split_csv(os.getenv("PROXMOX_ENDPOINTS", "")), proxmox_token_id=os.getenv("PROXMOX_TOKEN_ID", ""), proxmox_token_secret=os.getenv("PROXMOX_TOKEN_SECRET", ""), proxmox_user=os.getenv("PROXMOX_USER", ""), proxmox_password=os.getenv("PROXMOX_PASSWORD", ""), proxmox_verify_tls=_bool_env("PROXMOX_VERIFY_TLS", False), docker_enabled=_bool_env("DOCKER_ENABLED", True), docker_hosts=docker_hosts, docker_bearer_token=os.getenv("DOCKER_BEARER_TOKEN", ""), docker_agent_endpoints=_split_csv(os.getenv("DOCKER_AGENT_ENDPOINTS", "")), docker_agent_token=os.getenv("DOCKER_AGENT_TOKEN", ""), coolify_enabled=_bool_env("COOLIFY_ENABLED", True), coolify_endpoints=_split_csv(os.getenv("COOLIFY_ENDPOINTS", "")), coolify_api_token=os.getenv("COOLIFY_API_TOKEN", ""), )