use std::path::Path;
use serde_json::{json, Value};
use crate::data;
use crate::output::{emit, CliError, Ctx};
pub fn list(dir: &Path, ctx: Ctx) -> Result<(), CliError> {
let data = data::load(dir, "chats")?;
let map = data
.get("group_chats")
.cloned()
.unwrap_or(Value::Object(Default::default()));
emit(ctx, &map);
Ok(())
}
pub fn get(dir: &Path, ctx: Ctx, name: &str) -> Result<(), CliError> {
let data = data::load(dir, "chats")?;
let platform_default = data.get("platform").and_then(|v| v.as_str()).map(String::from);
let map = data
.get("group_chats")
.and_then(|v| v.as_object())
.cloned()
.unwrap_or_default();
let val = map.get(name).ok_or_else(|| {
CliError::not_found(
format!("chat not found: {name}"),
Some("try `liber chats list` for exact names".into()),
)
})?;
let (id, platform) = match val {
Value::String(s) => (Value::String(s.clone()), platform_default.clone()),
Value::Object(o) => (
o.get("id").cloned().unwrap_or(Value::Null),
o.get("platform")
.and_then(|v| v.as_str())
.map(String::from)
.or(platform_default.clone()),
),
other => (other.clone(), platform_default.clone()),
};
let mut out = json!({ "name": name, "id": id });
if let Some(p) = platform {
out.as_object_mut().unwrap().insert("platform".into(), Value::String(p));
}
emit(ctx, &out);
Ok(())
}