from pathlib import Path

from cyberbrain26 import paths

ALL_CB26_ENV = (
    "CB26_CONFIG_DIR", "CB26_DATA_DIR", "CB26_WORKSPACE_DIR",
    "CB26_CONVERSATIONS_DIR", "CB26_CHROMA_DIR", "CB26_LOGS_DIR",
    "CB26_CACHE_DIR",
)


def _clear_cb26_env(monkeypatch):
    for k in ALL_CB26_ENV:
        monkeypatch.delenv(k, raising=False)


def test_default_paths_use_xdg(monkeypatch):
    _clear_cb26_env(monkeypatch)
    assert "cyberbrain26" in str(paths.config_dir())
    assert "cyberbrain26" in str(paths.data_dir())
    assert paths.workspace_dir().parent == paths.data_dir()
    assert paths.conversations_dir().parent == paths.data_dir()
    assert paths.chroma_dir().parent == paths.workspace_dir()


def test_env_overrides(monkeypatch, tmp_path):
    _clear_cb26_env(monkeypatch)
    monkeypatch.setenv("CB26_DATA_DIR", str(tmp_path / "customdata"))
    assert paths.data_dir() == tmp_path / "customdata"
    assert paths.workspace_dir() == tmp_path / "customdata" / "workspace"


def test_env_overrides_workspace_explicit(monkeypatch, tmp_path):
    _clear_cb26_env(monkeypatch)
    monkeypatch.setenv("CB26_DATA_DIR", str(tmp_path / "customdata"))
    monkeypatch.setenv("CB26_WORKSPACE_DIR", str(tmp_path / "customws"))
    assert paths.workspace_dir() == tmp_path / "customws"


def test_ensure_dirs_creates_all(monkeypatch, tmp_path):
    _clear_cb26_env(monkeypatch)
    monkeypatch.setenv("CB26_CONFIG_DIR", str(tmp_path / "c"))
    monkeypatch.setenv("CB26_DATA_DIR", str(tmp_path / "d"))
    monkeypatch.setenv("CB26_CACHE_DIR", str(tmp_path / "ca"))
    paths.ensure_dirs()
    for p in paths.all_dirs():
        assert p.exists() and p.is_dir()


def test_no_hardcoded_home():
    src = Path(paths.__file__).read_text(encoding="utf-8")
    assert "/home/oem" not in src


def test_project_root_from_env(monkeypatch, tmp_path):
    monkeypatch.setenv("CB26_PROJECT_ROOT", str(tmp_path / "myproj"))
    assert paths.project_root() == tmp_path / "myproj"


def test_project_root_fallback_to_repo():
    # Bez env by melo vratit koren repa (kde je src/)
    import os as _os
    _os.environ.pop("CB26_PROJECT_ROOT", None)
    root = paths.project_root()
    assert (root / "src" / "cyberbrain26").is_dir(), f"ocekavan repo root, dostal {root}"
