complior-cli 0.9.0

AI Act Compliance Scanner & Fixer — CLI
use crate::config::TuiConfig;
use super::common::ensure_engine;

pub async fn run_jurisdiction_command(action: &crate::cli::JurisdictionAction, config: &TuiConfig) -> i32 {
    match action {
        crate::cli::JurisdictionAction::List { json } => run_jurisdiction_list(*json, config).await,
        crate::cli::JurisdictionAction::Show { code, json } => run_jurisdiction_show(code, *json, config).await,
    }
}

async fn run_jurisdiction_list(json_output: bool, config: &TuiConfig) -> i32 {
    let client = match ensure_engine(config).await {
        Ok(c) => c,
        Err(code) => return code,
    };

    match client.get_json("/jurisdictions").await {
        Ok(result) => {
            if let Some(err) = result.get("error") {
                eprintln!("Error: {err}");
                return 1;
            }
            if json_output {
                println!("{}", serde_json::to_string_pretty(&result).unwrap_or_default());
            } else if let Some(jurisdictions) = result.get("jurisdictions").and_then(|v| v.as_array()) {
                println!("EU/EEA AI Act Jurisdictions ({} countries)\n", jurisdictions.len());
                println!("{:<6} {:<20} {:<50}", "Code", "Country", "Market Surveillance Authority");
                println!("{}", "-".repeat(76));
                for j in jurisdictions {
                    let code = j.get("country_code").and_then(|v| v.as_str()).unwrap_or("");
                    let name = j.get("country_name").and_then(|v| v.as_str()).unwrap_or("");
                    let msa = j.get("msa_name").and_then(|v| v.as_str()).unwrap_or("");
                    println!("{code:<6} {name:<20} {msa:<50}");
                }
            }
            0
        }
        Err(e) => { eprintln!("Error: {e}"); 1 }
    }
}

async fn run_jurisdiction_show(code: &str, json_output: bool, config: &TuiConfig) -> i32 {
    let client = match ensure_engine(config).await {
        Ok(c) => c,
        Err(code) => return code,
    };

    let url = format!("/jurisdictions/{}", code.to_lowercase());
    match client.get_json(&url).await {
        Ok(result) => {
            if let Some(err) = result.get("error") {
                eprintln!("Error: {err}");
                return 1;
            }
            if json_output {
                println!("{}", serde_json::to_string_pretty(&result).unwrap_or_default());
            } else {
                let name = result.get("country_name").and_then(|v| v.as_str()).unwrap_or("Unknown");
                let msa = result.get("msa_name").and_then(|v| v.as_str()).unwrap_or("");
                let msa_url = result.get("msa_url").and_then(|v| v.as_str()).unwrap_or("");
                let contact = result.get("msa_contact").and_then(|v| v.as_str()).unwrap_or("");
                let enforcement = result.get("enforcement_date").and_then(|v| v.as_str()).unwrap_or("");
                let lang = result.get("language").and_then(|v| v.as_str()).unwrap_or("");

                println!("{} ({})", name, code.to_uppercase());
                println!();
                println!("Market Surveillance Authority:");
                println!("  Name:     {msa}");
                println!("  URL:      {msa_url}");
                println!("  Contact:  {contact}");
                println!();
                println!("Enforcement: {enforcement}");
                println!("Language:    {lang}");

                if let Some(reqs) = result.get("local_requirements").and_then(|v| v.as_array()) {
                    println!();
                    println!("Local Requirements:");
                    for req in reqs {
                        if let Some(r) = req.as_str() {
                            println!("  - {r}");
                        }
                    }
                }

                if let Some(notes) = result.get("notes").and_then(|v| v.as_str())
                    && !notes.is_empty() {
                        println!();
                        println!("Notes: {notes}");
                    }
            }
            0
        }
        Err(e) => { eprintln!("Error: {e}"); 1 }
    }
}