use clap::Subcommand;
use crate::client::ClickUpClient;
use crate::commands::auth::resolve_token;
use crate::error::CliError;
use crate::output::OutputConfig;
use crate::Cli;
#[derive(Subcommand)]
pub enum TagCommands {
List {
#[arg(long)]
space: String,
},
Create {
#[arg(long)]
space: String,
#[arg(long)]
name: String,
#[arg(long)]
fg_color: Option<String>,
#[arg(long)]
bg_color: Option<String>,
},
Update {
#[arg(long)]
space: String,
#[arg(long)]
tag: String,
#[arg(long)]
name: Option<String>,
#[arg(long)]
fg_color: Option<String>,
#[arg(long)]
bg_color: Option<String>,
},
Delete {
#[arg(long)]
space: String,
#[arg(long)]
tag: String,
},
}
const TAG_FIELDS: &[&str] = &["name", "tag_fg", "tag_bg"];
pub async fn execute(command: TagCommands, cli: &Cli) -> Result<(), CliError> {
let token = resolve_token(cli)?;
let client = ClickUpClient::new(&token, cli.timeout)?;
let output = OutputConfig::from_cli(&cli.output, &cli.fields, cli.no_header, cli.quiet);
match command {
TagCommands::List { space } => {
let resp = client
.get(&format!("/v2/space/{}/tag", space))
.await?;
let tags = resp
.get("tags")
.and_then(|t| t.as_array())
.cloned()
.unwrap_or_default();
output.print_items(&tags, TAG_FIELDS, "name");
Ok(())
}
TagCommands::Create {
space,
name,
fg_color,
bg_color,
} => {
let mut tag_obj = serde_json::json!({ "name": name });
if let Some(fg) = fg_color {
tag_obj["tag_fg"] = serde_json::Value::String(fg);
}
if let Some(bg) = bg_color {
tag_obj["tag_bg"] = serde_json::Value::String(bg);
}
let body = serde_json::json!({ "tag": tag_obj });
let resp = client
.post(&format!("/v2/space/{}/tag", space), &body)
.await?;
output.print_single(&resp, TAG_FIELDS, "name");
Ok(())
}
TagCommands::Update {
space,
tag,
name,
fg_color,
bg_color,
} => {
let mut tag_obj = serde_json::Map::new();
if let Some(n) = name {
tag_obj.insert("name".into(), serde_json::Value::String(n));
}
if let Some(fg) = fg_color {
tag_obj.insert("fg_color".into(), serde_json::Value::String(fg));
}
if let Some(bg) = bg_color {
tag_obj.insert("bg_color".into(), serde_json::Value::String(bg));
}
let body = serde_json::json!({ "tag": serde_json::Value::Object(tag_obj) });
let resp = client
.put(&format!("/v2/space/{}/tag/{}", space, tag), &body)
.await?;
output.print_single(&resp, TAG_FIELDS, "name");
Ok(())
}
TagCommands::Delete { space, tag } => {
client
.delete(&format!("/v2/space/{}/tag/{}", space, tag))
.await?;
output.print_message(&format!("Tag '{}' deleted from space {}", tag, space));
Ok(())
}
}
}