//! 记忆系统配置
//!
//! 通过 `init()` 配置数据存储目录，默认使用 `~/.ai-memory/`。

use std::path::PathBuf;
use std::sync::Mutex;

/// 全局数据目录锁（Mutex 允许测试重置）
static DATA_DIR: Mutex<Option<PathBuf>> = Mutex::new(None);

/// 初始化记忆系统，设置自定义数据目录。
///
/// 可以多次调用以重置数据目录（生产代码通常只调用一次）。
///
/// # Example
///
/// ```rust
/// use std::path::PathBuf;
/// use ai_memory_core::init;
///
/// init(PathBuf::from("/custom/path"));
/// ```
pub fn init(dir: PathBuf) {
    let mut guard = DATA_DIR.lock().expect("DATA_DIR lock poisoned");
    *guard = Some(dir);
}

/// 获取当前配置的数据目录。
///
/// 优先级：
/// 1. 通过 `init()` 设置的自定义目录
/// 2. 默认：`~/.ai-memory/`
pub(crate) fn data_dir() -> PathBuf {
    let guard = DATA_DIR.lock().expect("DATA_DIR lock poisoned");
    guard
        .clone()
        .unwrap_or_else(|| {
            dirs::home_dir()
                .expect("无法确定 home 目录")
                .join(".ai-memory")
        })
}

/// 记忆文件路径
pub fn memories_file() -> PathBuf {
    data_dir().join("memories.md")
}

/// 元数据文件路径
pub fn metadata_file() -> PathBuf {
    data_dir().join("memories.meta.json")
}

/// 确保数据目录存在
pub(crate) fn ensure_data_dir() -> Result<(), std::io::Error> {
    let dir = data_dir();
    if !dir.exists() {
        std::fs::create_dir_all(&dir)?;
    }
    Ok(())
}

/// 清除自定义数据目录，恢复到默认路径（仅测试用）
#[cfg(test)]
pub fn reset() {
    let mut guard = DATA_DIR.lock().expect("DATA_DIR lock poisoned");
    *guard = None;
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_memories_file_path() {
        // 使用默认路径时验证格式
        reset();
        let file = memories_file();
        assert!(
            file.to_str().unwrap().contains(".ai-memory"),
            "Expected path to contain .ai-memory, got: {:?}",
            file
        );
    }

    #[test]
    fn test_metadata_file_path() {
        reset();
        let file = metadata_file();
        assert!(
            file.to_str().unwrap().contains(".ai-memory/memories.meta.json"),
            "Expected path to contain .ai-memory/memories.meta.json, got: {:?}",
            file
        );
    }

    #[test]
    fn test_init_custom_dir() {
        let custom = PathBuf::from("/tmp/custom-ai-memory");
        init(custom.clone());
        let dir = data_dir();
        assert_eq!(dir, custom);
        reset();
    }
}
