use serde::{Deserialize, Serialize};

const BASH_RULES_MARKER: &str = "<!-- beast:bash-rules:start -->";

#[derive(Debug, Serialize, Deserialize)]
pub struct BeastGlobalStatus {
    /// Beast 是否已安装（settings.manifest.json 中存在 beast-mode 记录）
    pub installed: bool,
    /// 当前是否处于狂暴模式（permissions.allow 包含 Bash(*)）
    pub active: bool,
    /// ~/.claude/CLAUDE.md 是否已含 Beast 注入的 bash 规则
    pub has_bash_rules: bool,
}

fn claude_home_dir() -> Option<std::path::PathBuf> {
    let home = std::env::var("USERPROFILE")
        .or_else(|_| std::env::var("HOME"))
        .ok()?;
    Some(std::path::Path::new(&home).join(".claude"))
}

/// 读取全局 Beast 安装状态（只读，不修改任何文件）。
#[tauri::command]
pub async fn get_beast_global_status() -> Result<BeastGlobalStatus, String> {
    let claude_dir = match claude_home_dir() {
        Some(d) => d,
        None => return Ok(BeastGlobalStatus { installed: false, active: false, has_bash_rules: false }),
    };

    // 检查安装状态（manifest）
    let installed = {
        let manifest_path = claude_dir.join("settings.manifest.json");
        if manifest_path.exists() {
            let content = std::fs::read_to_string(&manifest_path).unwrap_or_default();
            let json: serde_json::Value = serde_json::from_str(&content)
                .unwrap_or(serde_json::Value::Object(Default::default()));
            json.get("beast-mode").is_some()
        } else {
            false
        }
    };

    // 检查当前模式（settings.json 中 allow 是否包含 Bash(*)）
    let active = {
        let settings_path = claude_dir.join("settings.json");
        if settings_path.exists() {
            let content = std::fs::read_to_string(&settings_path).unwrap_or_default();
            let json: serde_json::Value = serde_json::from_str(&content)
                .unwrap_or(serde_json::Value::Object(Default::default()));
            json["permissions"]["allow"]
                .as_array()
                .map(|arr| arr.iter().any(|v| v.as_str() == Some("Bash(*)")))
                .unwrap_or(false)
        } else {
            false
        }
    };

    // 检查 bash 规则是否已注入 ~/.claude/CLAUDE.md
    let has_bash_rules = {
        let claude_md = claude_dir.join("CLAUDE.md");
        if claude_md.exists() {
            let content = std::fs::read_to_string(&claude_md).unwrap_or_default();
            content.contains(BASH_RULES_MARKER)
        } else {
            false
        }
    };

    Ok(BeastGlobalStatus { installed, active, has_bash_rules })
}
