"""Configuration from environment variables (same code for the shared server and local Docker)."""
from __future__ import annotations

import os
from dataclasses import dataclass, field
from pathlib import Path

_ROOT = Path(__file__).resolve().parents[2]


def _env(name, default, cast=str):
    v = os.environ.get(name)
    return cast(v) if v not in (None, "") else default


@dataclass
class Settings:
    storage: Path = field(default_factory=lambda: Path(_env("STUDIO_STORAGE", str(_ROOT / "storage"))))
    examples: Path = field(default_factory=lambda: Path(_env("STUDIO_EXAMPLES", str(_ROOT / "examples"))))
    static: Path = field(default_factory=lambda: Path(_env("STUDIO_STATIC", str(Path(__file__).parent / "static"))))
    max_upload_mb: int = field(default_factory=lambda: _env("STUDIO_MAX_UPLOAD_MB", 50, int))
    max_pairs: int = field(default_factory=lambda: _env("STUDIO_MAX_PAIRS", 250_000, int))
    max_concurrent_jobs: int = field(default_factory=lambda: _env("STUDIO_MAX_CONCURRENT_JOBS", 2, int))
    max_queued_jobs: int = field(default_factory=lambda: _env("STUDIO_MAX_QUEUED_JOBS", 20, int))
    job_threads: int = field(default_factory=lambda: _env("STUDIO_JOB_THREADS", 4, int))
    retention_days: float = field(default_factory=lambda: _env("STUDIO_RETENTION_DAYS", 7.0, float))
    allowed_presets: tuple = field(default_factory=lambda: tuple(_env("STUDIO_PRESETS", "quick,standard,full").split(",")))
    cors_origins: tuple = field(default_factory=lambda: tuple(o for o in _env("STUDIO_CORS_ORIGINS", "").split(",") if o))

    @property
    def db_path(self) -> Path:
        return self.storage / "studio.sqlite3"

    def ensure(self):
        for sub in ("datasets", "jobs"):
            (self.storage / sub).mkdir(parents=True, exist_ok=True)
        return self


settings = Settings()
