"""Agnosticke cesty pro CyberBrain26."""
from __future__ import annotations

import os
from pathlib import Path

from platformdirs import user_cache_dir, user_config_dir, user_data_dir

APP_NAME = "cyberbrain26"
APP_AUTHOR = "CyberBrain"


def _resolve(env_var: str, default: Path) -> Path:
    raw = os.environ.get(env_var)
    return Path(raw).expanduser() if raw else default


def config_dir() -> Path:
    return _resolve("CB26_CONFIG_DIR", Path(user_config_dir(APP_NAME, APP_AUTHOR)))


def data_dir() -> Path:
    return _resolve("CB26_DATA_DIR", Path(user_data_dir(APP_NAME, APP_AUTHOR)))


def cache_dir() -> Path:
    return _resolve("CB26_CACHE_DIR", Path(user_cache_dir(APP_NAME, APP_AUTHOR)))


def workspace_dir() -> Path:
    return _resolve("CB26_WORKSPACE_DIR", data_dir() / "workspace")


def conversations_dir() -> Path:
    return _resolve("CB26_CONVERSATIONS_DIR", data_dir() / "conversations")


def chroma_dir() -> Path:
    return _resolve("CB26_CHROMA_DIR", workspace_dir() / "chroma_db")


def logs_dir() -> Path:
    return _resolve("CB26_LOGS_DIR", data_dir() / "logs")


def env_file() -> Path:
    return config_dir() / ".env"


def all_dirs() -> tuple[Path, ...]:
    return (
        config_dir(),
        data_dir(),
        cache_dir(),
        workspace_dir(),
        conversations_dir(),
        chroma_dir(),
        logs_dir(),
    )


def ensure_dirs() -> None:
    for d in all_dirs():
        d.mkdir(parents=True, exist_ok=True)


def project_root() -> Path:
    """Vrati koren projektu (repo).

    Priorita:
      1) CB26_PROJECT_ROOT env promenna (explicitni override)
      2) Odvozeno z umisteni tohoto souboru:
         src/cyberbrain26/paths.py -> parents[2] = repo root
    """
    raw = os.environ.get("CB26_PROJECT_ROOT")
    if raw:
        return Path(raw).expanduser()
    # paths.py -> parents[0]=cyberbrain26, [1]=src, [2]=repo root
    return Path(__file__).resolve().parents[2]


def load_env(override: bool = False) -> None:
    """Nacte .env z config_dir() do os.environ.

    Pouziva se v CLI pred spustenim sluzeb, aby API klice a dalsi
    nastaveni byly k dispozici subprocessum.

    Args:
        override: pokud True, hodnoty z .env prebiji jiz existujici env.
                  Default False - existujici env (napr. CB26_* z env.sh)
                  ma prednost.
    """
    env = env_file()
    if not env.exists():
        return
    try:
        from dotenv import load_dotenv
    except ImportError:
        return
    load_dotenv(env, override=override)
