#!/usr/bin/env python3
"""
配置模块 - 统一管理项目配置
"""
import os
from pathlib import Path
from typing import Optional


class Config:
    """项目配置类"""

    # 默认缓存根目录（用户主目录下的 cache）
    _DEFAULT_CACHE_ROOT = os.path.expanduser("~/cache")

    # 缓存根目录
    _cache_root: Optional[str] = None

    @classmethod
    def get_cache_root(cls) -> str:
        """
        获取缓存根目录

        Returns:
            缓存根目录路径
        """
        if cls._cache_root is None:
            # 1. 优先从环境变量读取
            cache_root = os.environ.get("CACHE_ROOT")
            if cache_root:
                cls._cache_root = cache_root
            else:
                # 2. 使用默认路径
                cls._cache_root = cls._DEFAULT_CACHE_ROOT

        return cls._cache_root

    @classmethod
    def set_cache_root(cls, path: str) -> None:
        """
        设置缓存根目录

        Args:
            path: 缓存根目录路径（可以是绝对路径或相对路径）
        """
        cls._cache_root = path

    @classmethod
    def get_cache_dir(cls, subdir: str) -> str:
        """
        获取特定子模块的缓存目录

        Args:
            subdir: 子目录名称，如：
                - "text_embedding", "semantic_similarity" - 计算缓存
                - "data/search", "data/detail" - 爬虫数据缓存
                - "data/analysis" - 分析结果缓存

        Returns:
            完整的缓存目录路径
        """
        cache_root = cls.get_cache_root()
        return str(Path(cache_root) / subdir)

    @classmethod
    def get_data_dir(cls, subdir: str = "") -> str:
        """
        获取数据缓存目录（data 目录现在在缓存根目录下）

        Args:
            subdir: 子目录名称，如 "search", "detail", "tools_list" 等
                   如果为空字符串，返回 data 根目录

        Returns:
            完整的数据目录路径

        Note:
            data 目录现在统一放在缓存根目录下：
            - 默认：cache/data/
            - 如果设置了 CACHE_ROOT=/custom: /custom/data/
        """
        cache_root = cls.get_cache_root()
        if subdir:
            return str(Path(cache_root) / "data" / subdir)
        return str(Path(cache_root) / "data")

    @classmethod
    def reset(cls) -> None:
        """
        重置配置为默认值（主要用于测试）
        """
        cls._cache_root = None


# 便捷函数
def get_cache_root() -> str:
    """获取缓存根目录"""
    return Config.get_cache_root()


def set_cache_root(path: str) -> None:
    """设置缓存根目录"""
    Config.set_cache_root(path)


def get_cache_dir(subdir: str) -> str:
    """获取特定子模块的缓存目录"""
    return Config.get_cache_dir(subdir)


def get_data_dir(subdir: str = "") -> str:
    """
    获取数据缓存目录

    Note: data 目录现在在缓存根目录下，例如 cache/data/
    """
    return Config.get_data_dir(subdir)


if __name__ == "__main__":
    print("=" * 60)
    print("配置模块示例")
    print("=" * 60)
    print()

    # 示例 1: 使用默认配置
    print("示例 1: 默认配置")
    print(f"缓存根目录: {get_cache_root()}")
    print(f"text_embedding 缓存: {get_cache_dir('text_embedding')}")
    print(f"semantic_similarity 缓存: {get_cache_dir('semantic_similarity')}")
    print()

    # 示例 2: 自定义缓存根目录
    print("示例 2: 自定义缓存根目录")
    set_cache_root("/tmp/my_cache")
    print(f"缓存根目录: {get_cache_root()}")
    print(f"text_embedding 缓存: {get_cache_dir('text_embedding')}")
    print(f"semantic_similarity 缓存: {get_cache_dir('semantic_similarity')}")
    print()

    # 示例 3: 使用相对路径
    print("示例 3: 使用相对路径")
    set_cache_root("data/cache")
    print(f"缓存根目录: {get_cache_root()}")
    print(f"text_embedding 缓存: {get_cache_dir('text_embedding')}")
    print()

    # 示例 4: 通过环境变量设置
    print("示例 4: 通过环境变量设置")
    Config.reset()  # 重置配置
    os.environ["CACHE_ROOT"] = "/Users/semsevens/Desktop/workspace/daily/1113/how_1120_v3/cache"
    print(f"缓存根目录: {get_cache_root()}")
    print(f"text_embedding 缓存: {get_cache_dir('text_embedding')}")
    print()

    # 示例 5: 数据目录配置（在缓存根目录下）
    print("示例 5: 数据目录配置（在缓存根目录下）")
    Config.reset()  # 重置配置
    print(f"缓存根目录: {get_cache_root()}")
    print(f"data 目录: {get_data_dir()}")
    print(f"search 数据: {get_data_dir('search')}")
    print(f"detail 数据: {get_data_dir('detail')}")
    print()

    # 示例 6: 设置缓存根目录后，data 也会跟着变
    print("示例 6: 设置缓存根目录后，data 也会跟着变")
    set_cache_root("/custom/cache")
    print(f"缓存根目录: {get_cache_root()}")
    print(f"data 目录: {get_data_dir()}")
    print(f"search 数据: {get_data_dir('search')}")
    print()

    print("=" * 60)
    print("使用方法:")
    print("-" * 60)
    print("缓存根目录:")
    print("  1. 默认使用 'cache' 目录")
    print("  2. 通过代码设置: set_cache_root('/path/to/cache')")
    print("  3. 通过环境变量: export CACHE_ROOT=/path/to/cache")
    print()
    print("目录结构:")
    print("  cache/")
    print("    ├── text_embedding/          # 向量相似度缓存")
    print("    ├── semantic_similarity/     # 语义相似度缓存")
    print("    └── data/                    # 数据缓存（原 data 目录）")
    print("        ├── search/              # 搜索数据")
    print("        ├── detail/              # 详情数据")
    print("        └── analysis/            # 分析结果")
    print("=" * 60)
