use std::process::Command;

/// Open a Hydrogen webview tab pointing at the preview URL, on a non-VS-Code pane.
/// Mirrors the adom-workspace-control skill — never land on the pane hosting VS Code.
pub fn open_webview_tab(name: &str, url: &str) -> Result<(), String> {
    // Resolve a non-VS-Code panel id via adom-cli.
    let state = Command::new("adom-cli")
        .args(["hydrogen", "workspace", "state"])
        .output()
        .map_err(|e| format!("adom-cli not available: {e}"))?;
    if !state.status.success() {
        return Err(format!(
            "adom-cli state failed: {}",
            String::from_utf8_lossy(&state.stderr)
        ));
    }
    let panel_id = first_non_vscode_panel(&String::from_utf8_lossy(&state.stdout));

    let mut cmd = Command::new("adom-cli");
    cmd.args([
        "hydrogen", "workspace", "add-tab",
        "--panel-type", "adom/a1b2c3d4-0031-4000-a000-000000000031",
        "--display-name", name,
        "--url", url,
    ]);
    if let Some(pid) = panel_id {
        cmd.args(["--panel-id", &pid]);
    }
    let out = cmd.output().map_err(|e| format!("add-tab exec: {e}"))?;
    if !out.status.success() {
        return Err(format!(
            "add-tab failed: {}",
            String::from_utf8_lossy(&out.stderr)
        ));
    }
    Ok(())
}

fn first_non_vscode_panel(state_json: &str) -> Option<String> {
    let v: serde_json::Value = serde_json::from_str(state_json).ok()?;
    let panels = v.get("panels")?.as_array()?;
    for p in panels {
        let id = p.get("id")?.as_str()?;
        let tabs = p.get("tabs").and_then(|t| t.as_array()).cloned().unwrap_or_default();
        let hosts_vscode = tabs.iter().any(|t| {
            t.get("panelType")
                .and_then(|s| s.as_str())
                .map(|s| s.contains("vscode"))
                .unwrap_or(false)
        });
        if !hosts_vscode {
            return Some(id.to_string());
        }
    }
    None
}