// Felles hjelpefunksjoner for å spawne CLI-verktøy fra jobbkø-handlere.
//
// Mønsteret: maskinrommet orkestrerer (payload-parsing, sikkerhetskontroller),
// CLI-verktøyet gjør jobben (API-kall, DB-skriving, prosessering).
// Stdout → jobbresultat (JSON), stderr → feillogg, exitkode → status.
//
// Ref: docs/retninger/unix_filosofi.md

use std::process::Stdio;

/// Kjør et CLI-verktøy og returner stdout som JSON.
///
/// - `bin_name`: Verktøynavn for logging (f.eks. "synops-tts")
/// - `cmd`: Ferdig konfigurert Command med args og env
///
/// Stderr logges. Non-zero exit code gir Err med stderr-innhold.
pub async fn run_cli_tool(
    bin_name: &str,
    cmd: &mut tokio::process::Command,
) -> Result<serde_json::Value, String> {
    cmd.stdout(Stdio::piped()).stderr(Stdio::piped());

    let child = cmd
        .spawn()
        .map_err(|e| format!("Kunne ikke starte {bin_name}: {e}"))?;

    let output = child
        .wait_with_output()
        .await
        .map_err(|e| format!("Feil ved kjøring av {bin_name}: {e}"))?;

    let stderr = String::from_utf8_lossy(&output.stderr);
    if !stderr.is_empty() {
        tracing::info!(stderr = %stderr, "{bin_name} stderr");
    }

    if !output.status.success() {
        let code = output.status.code().unwrap_or(-1);
        return Err(format!(
            "{bin_name} feilet (exit {code}): {stderr}"
        ));
    }

    let stdout = String::from_utf8_lossy(&output.stdout);
    serde_json::from_str(&stdout)
        .map_err(|e| format!("Kunne ikke parse {bin_name} output: {e}"))
}

/// Videresend en miljøvariabel til en Command hvis den er satt.
pub fn forward_env(cmd: &mut tokio::process::Command, key: &str) {
    if let Ok(v) = std::env::var(key) {
        cmd.env(key, v);
    }
}

/// Sett DATABASE_URL på en Command. Feiler hvis variabelen mangler.
pub fn set_database_url(cmd: &mut tokio::process::Command) -> Result<(), String> {
    let db_url = std::env::var("DATABASE_URL")
        .map_err(|_| "DATABASE_URL ikke satt".to_string())?;
    cmd.env("DATABASE_URL", &db_url);
    Ok(())
}
