use crate::daemon_port_path;
use anyhow::Result;
use colored::Colorize;
pub async fn handle_stop() -> Result<()> {
let lock_path = dirs::data_local_dir().map(|d| d.join("trusty-search").join("daemon.lock"));
let port_path = daemon_port_path();
let pid = lock_path
.as_ref()
.and_then(|p| std::fs::read_to_string(p).ok())
.and_then(|s| s.trim().parse::<u32>().ok());
match pid {
None => {
eprintln!("{} No daemon running (no PID file)", "✗".red());
std::process::exit(1);
}
Some(pid) => {
println!("{} Stopping daemon (PID {})…", "⟳".cyan(), pid);
let status = std::process::Command::new("kill")
.arg("-TERM")
.arg(pid.to_string())
.status();
match status {
Ok(s) if s.success() => {
for _ in 0..50 {
std::thread::sleep(std::time::Duration::from_millis(100));
if port_path.as_ref().map(|p| !p.exists()).unwrap_or(true) {
println!("{} Daemon stopped", "✓".green());
return Ok(());
}
}
println!("{} Daemon may still be shutting down", "⚠".yellow());
}
_ => {
eprintln!(
"{} Failed to send SIGTERM (process may already be gone)",
"✗".red()
);
std::process::exit(1);
}
}
}
}
Ok(())
}