"""Extended tests for paths module - covering untested directory functions."""

from pathlib import Path

from local_deep_research.config.paths import (
    get_library_directory,
    get_config_directory,
    get_models_directory,
    get_research_outputs_directory,
)


class TestGetLibraryDirectory:
    """Tests for get_library_directory function."""

    def test_returns_library_subdirectory(self, mock_env_data_dir):
        """Should return library subdirectory of data dir."""
        result = get_library_directory()
        assert result.name == "library"
        assert result.parent == mock_env_data_dir

    def test_creates_directory(self, mock_env_data_dir):
        """Should create directory if it doesn't exist."""
        result = get_library_directory()
        assert result.exists()
        assert result.is_dir()

    def test_returns_path_object(self, mock_env_data_dir):
        """Should return Path object."""
        result = get_library_directory()
        assert isinstance(result, Path)

    def test_idempotent_when_directory_exists(self, mock_env_data_dir):
        """Calling twice should work fine when directory already exists."""
        result1 = get_library_directory()
        result2 = get_library_directory()
        assert result1 == result2
        assert result1.exists()


class TestGetConfigDirectory:
    """Tests for get_config_directory function."""

    def test_returns_config_subdirectory(self, mock_env_data_dir):
        """Should return config subdirectory of data dir."""
        result = get_config_directory()
        assert result.name == "config"
        assert result.parent == mock_env_data_dir

    def test_creates_directory(self, mock_env_data_dir):
        """Should create directory if it doesn't exist."""
        result = get_config_directory()
        assert result.exists()
        assert result.is_dir()

    def test_returns_path_object(self, mock_env_data_dir):
        """Should return Path object."""
        result = get_config_directory()
        assert isinstance(result, Path)


class TestGetModelsDirectory:
    """Tests for get_models_directory function."""

    def test_returns_models_subdirectory(self, mock_env_data_dir):
        """Should return models subdirectory of data dir."""
        result = get_models_directory()
        assert result.name == "models"
        assert result.parent == mock_env_data_dir

    def test_creates_directory(self, mock_env_data_dir):
        """Should create directory if it doesn't exist."""
        result = get_models_directory()
        assert result.exists()
        assert result.is_dir()

    def test_returns_path_object(self, mock_env_data_dir):
        """Should return Path object."""
        result = get_models_directory()
        assert isinstance(result, Path)


class TestAllDirectoriesUseDataDir:
    """Verify all directory functions consistently use get_data_directory as base."""

    def test_all_subdirectories_share_same_parent(self, mock_env_data_dir):
        """All subdirectory functions should use the same data directory."""
        library = get_library_directory()
        config = get_config_directory()
        models = get_models_directory()
        outputs = get_research_outputs_directory()

        assert library.parent == mock_env_data_dir
        assert config.parent == mock_env_data_dir
        assert models.parent == mock_env_data_dir
        assert outputs.parent == mock_env_data_dir

    def test_env_var_override_affects_all_directories(
        self, tmp_path, monkeypatch
    ):
        """LDR_DATA_DIR override should affect all directory functions."""
        custom_dir = tmp_path / "custom_data"
        custom_dir.mkdir()
        monkeypatch.setenv("LDR_DATA_DIR", str(custom_dir))

        library = get_library_directory()
        config = get_config_directory()
        models = get_models_directory()

        assert library.parent == custom_dir
        assert config.parent == custom_dir
        assert models.parent == custom_dir

    def test_all_directories_are_distinct(self, mock_env_data_dir):
        """All directory functions should return different paths."""
        library = get_library_directory()
        config = get_config_directory()
        models = get_models_directory()
        outputs = get_research_outputs_directory()

        paths = {library, config, models, outputs}
        assert len(paths) == 4, "All directory paths should be unique"
