use serde_json::{json, Value};
use crate::error::Result;
use crate::ir::{ApiKind, ApiSpec};
pub fn render(spec: &ApiSpec) -> Result<String> {
let id = spec.name.replace('_', "-");
let bin = format!("{id}-cli");
let kind = match spec.kind {
ApiKind::OpenApi | ApiKind::GraphQl | ApiKind::Grpc => "native",
};
let mut manifest: Value = json!({
"id": id,
"name": spec.display_name,
"version": spec.version,
"kind": kind,
"description": spec.description.clone().unwrap_or_else(|| spec.display_name.clone()),
"spec_kind": spec.kind.slug(),
"binary": bin,
"skill": "SKILL.md",
"mcp": "mcp.json",
"operations": spec.operations.iter().map(|o| o.id.clone()).collect::<Vec<_>>(),
});
if let Some(base) = &spec.base_url {
manifest["base_url"] = json!(base);
}
Ok(serde_json::to_string_pretty(&manifest)?)
}