use crate::multiplexer::handle::mode_label;
use crate::multiplexer::{MuxHandle, create_backend, detect_backend};
use crate::{config, git, sandbox};
use anyhow::{Context, Result, anyhow};
pub fn run(name: Option<&str>) -> Result<()> {
let config = config::Config::load(None)?;
let mux = create_backend(detect_backend());
let prefix = config.window_prefix();
let resolved_handle = match name {
Some(n) => {
let (path, _branch) = git::find_worktree(n).map_err(|_| {
anyhow!(
"Worktree '{}' not found. Use 'workmux list' to see available worktrees.",
n
)
})?;
path.file_name()
.ok_or_else(|| anyhow!("Invalid worktree path: no directory name"))?
.to_string_lossy()
.to_string()
}
None => super::resolve_name(None)?,
};
let mode = git::get_worktree_mode(&resolved_handle);
let (full_target_name, is_current_target) = match name {
Some(_) => {
let target = MuxHandle::new(mux.as_ref(), mode, prefix, &resolved_handle);
let full = target.full_name();
let current = target.current_name()?;
let is_current = current.as_deref() == Some(full.as_str());
(full, is_current)
}
None => {
let target = MuxHandle::new(mux.as_ref(), mode, prefix, &resolved_handle);
let current_name = target.current_name()?;
if let Some(current) = current_name {
if current.starts_with(prefix) {
(current.clone(), true)
} else {
(target.full_name(), false)
}
} else {
(target.full_name(), false)
}
}
};
let kind = mode_label(mode);
let target_exists = MuxHandle::exists_full(mux.as_ref(), mode, &full_target_name)?;
if !target_exists {
return Err(anyhow!(
"No active {} found for '{}'. The worktree exists but has no open {}.",
kind,
full_target_name,
kind
));
}
if let Some(handle) = full_target_name.strip_prefix(prefix) {
sandbox::stop_containers_for_handle(handle);
}
if is_current_target {
let delay = std::time::Duration::from_millis(100);
MuxHandle::schedule_close_full(mux.as_ref(), mode, &full_target_name, delay)?;
} else {
MuxHandle::kill_full(mux.as_ref(), mode, &full_target_name)
.context("Failed to close target")?;
println!("✓ Closed {} '{}' (worktree kept)", kind, full_target_name);
}
Ok(())
}