use anyhow::Result;
use serde::Serialize;
use std::path::Path;

use crate::db;
use crate::ops;

#[derive(Serialize)]
struct RmResult {
    requested_ids: Vec<String>,
    deleted_ids: Vec<String>,
    unblocked_ids: Vec<String>,
}

pub fn run(root: &Path, ids: &[String], recursive: bool, force: bool, json: bool) -> Result<()> {
    let store = db::open(root)?;

    let resolved: Vec<db::TaskId> = ids
        .iter()
        .map(|raw| db::resolve_task_id(&store, raw, false))
        .collect::<Result<_>>()?;

    let result = ops::soft_delete(&store, &resolved, recursive)?;

    if !force && !result.unblocked_ids.is_empty() {
        let short: Vec<String> = result
            .unblocked_ids
            .iter()
            .map(ToString::to_string)
            .collect();
        eprintln!("warning: removed blockers from {}", short.join(", "));
    }

    if json {
        let out = RmResult {
            requested_ids: ids.to_vec(),
            deleted_ids: result.deleted_ids.iter().map(ToString::to_string).collect(),
            unblocked_ids: result
                .unblocked_ids
                .iter()
                .map(ToString::to_string)
                .collect(),
        };
        println!("{}", serde_json::to_string(&out)?);
    } else {
        let c = crate::color::stdout_theme();
        for id in result.deleted_ids {
            println!("{}deleted{} {id}", c.green, c.reset);
        }
    }

    Ok(())
}
