/// AUTO-GENERATED BY Kam/scripts/add_missing_docs.py: placeholder documentation for public function 'build_track_json'. Replace with real documentation. (2025-12-30T22:23:21Z)
#[must_use]
pub fn build_track_json(kt: &KamToml) -> serde_json::Value {
    let mut root = serde_json::Map::new();

    root.insert(
        "id".to_string(),
        serde_json::Value::String(kt.prop.id.clone()),
    );
    root.insert("enable".to_string(), serde_json::Value::Bool(true)); // 默认启用

    // source字段：优先repository，没有就用homepage，再没有就用updateJson
    let source = kt
        .mmrl
        .as_ref()
        .and_then(|m| m.repo.as_ref())
        .and_then(|r| r.repository.clone())
        .or_else(|| {
            kt.mmrl
                .as_ref()
                .and_then(|m| m.repo.as_ref())
                .and_then(|r| r.homepage.clone())
        })
        .or_else(|| kt.prop.updateJson.clone())
        .unwrap_or_default();
    root.insert("source".to_string(), serde_json::Value::String(source));

    // update_to字段：优先updateJson，没有就根据repository推断，再没有就用版本号
    // 这个逻辑有点复杂，但至少能覆盖大部分情况
    let update_to = kt.prop.updateJson.as_ref().map_or_else(
        || {
            kt.mmrl
                .as_ref()
                .and_then(|mmrl| mmrl.repo.as_ref())
                .and_then(|repo| {
                    repo.repository.as_ref().map(|repo_url| {
                        // 有仓库URL，按GitHub releases格式推断
                        format!(
                            "{}/releases/latest/download/{}.zip",
                            repo_url.trim_end_matches('/'),
                            kt.prop.id
                        )
                    })
                })
                .unwrap_or_else(|| kt.prop.version.clone())
        },
        String::clone,
    );
    root.insert(
        "update_to".to_string(),
        serde_json::Value::String(update_to),
    );

    let repo_json = build_repo_json(kt);
    if let Some(map) = repo_json.as_object() {
        for (k, v) in map {
            root.insert(k.clone(), v.clone());
        }
    }

    root.insert("enable".to_string(), serde_json::Value::Bool(true));

    // features字段：检查各种功能是否启用
    // 这个列表可能不够完整，但至少覆盖了常见的功能
    let mut features_map = serde_json::Map::new();
    let keys = vec![
        "service",
        "post_fs_data",
        "resetprop",
        "sepolicy",
        "zygisk",
        "apks",
        "webroot",
        "post_mount",
        "boot_completed",
        "modconf",
    ];
    let repo_features = kt
        .mmrl
        .as_ref()
        .and_then(|m| m.repo.as_ref())
        .and_then(|r| r.features.clone())
        .unwrap_or_default();
    // 检查每个功能是否在features列表里
    for k in keys {
        let val = repo_features.iter().any(|s| s == k);
        features_map.insert(k.to_string(), serde_json::Value::Bool(val));
    }
    root.insert(
        "features".to_string(),
        serde_json::Value::Object(features_map),
    );

    serde_json::Value::Object(root)
}

// 构建config.json内容
// 这个格式可能也不太常用，但为了完整性还是实现了
/// AUTO-GENERATED BY Kam/scripts/add_missing_docs.py: placeholder documentation for public function 'build_config_json'. Replace with real documentation. (2025-12-30T22:23:21Z)
#[must_use]
pub fn build_config_json(kt: &KamToml) -> serde_json::Value {
    let mut root = serde_json::Map::new();

    // id：优先从repository URL提取，没有就用prop.id
    let id = kt
        .mmrl
        .as_ref()
        .and_then(|m| m.repo.as_ref())
        .and_then(|r| r.repository.as_ref())
        .map_or_else(
            || kt.prop.id.clone(),
            |s| s.split('/').next_back().unwrap_or(s).to_string(),
        ); // 取URL最后一部分
    root.insert("id".to_string(), serde_json::Value::String(id));

    root.insert(
        "name".to_string(),
        serde_json::Value::String(kt.prop.name.clone()),
    );

    // base_url：优先homepage，没有就用repository
    // 确保末尾有斜杠（虽然可能不太重要）
    let base_url = kt
        .mmrl
        .as_ref()
        .and_then(|m| m.repo.as_ref())
        .and_then(|r| r.homepage.clone())
        .or_else(|| {
            kt.mmrl
                .as_ref()
                .and_then(|m| m.repo.as_ref().and_then(|r| r.repository.clone()))
        })
        .unwrap_or_default();
    let mut base_url = base_url;
    if !base_url.is_empty() && !base_url.ends_with('/') {
        base_url.push('/'); // 确保末尾有斜杠
    }
    root.insert("base_url".to_string(), serde_json::Value::String(base_url));

    if let Some(mmrl) = &kt.mmrl
        && let Some(repo) = &mmrl.repo
    {
        if let Some(website) = &repo.homepage
            && !website.is_empty()
        {
            root.insert(
                "website".to_string(),
                serde_json::Value::String(website.clone()),
            );
        }
        if let Some(support) = &repo.support
            && !support.is_empty()
        {
            root.insert(
                "support".to_string(),
                serde_json::Value::String(support.clone()),
            );
        }
        if let Some(donate) = &repo.donate
            && !donate.is_empty()
        {
            root.insert(
                "donate".to_string(),
                serde_json::Value::String(donate.clone()),
            );
        }
        if let Some(sub) = &repo.documentation
            && !sub.is_empty()
        {
            root.insert(
                "submission".to_string(),
                serde_json::Value::String(sub.clone()),
            );
        }
    }

    if !kt.prop.description.trim().is_empty() {
        root.insert(
            "description".to_string(),
            serde_json::Value::String(kt.prop.description.clone()),
        );
    }

    if let Some(mmrl) = &kt.mmrl
        && let Some(repo) = &mmrl.repo
        && let Some(max) = repo.max_num
    {
        root.insert("max_num".to_string(), serde_json::Value::Number(max.into()));
    }

    root.insert("enable_log".to_string(), serde_json::Value::Bool(true));
    root.insert(
        "log_dir".to_string(),
        serde_json::Value::String("log".to_string()),
    );

    serde_json::Value::Object(root)
}
