use crate::output::CommandSpinner;
use anyhow::{Result, anyhow};
use clap::Args;
use console::style;
use dialoguer::Confirm;
use opencode_cloud_core::config::load_config_or_default;
use opencode_cloud_core::platform::{
ServiceConfig, get_service_manager, is_service_registration_supported,
};
#[derive(Args)]
pub struct InstallArgs {
#[arg(long)]
force: bool,
#[arg(long)]
dry_run: bool,
}
pub async fn cmd_install(args: &InstallArgs, quiet: bool, _verbose: u8) -> Result<()> {
if !is_service_registration_supported() {
return Err(anyhow!(
"Service registration not supported on this platform.\n\
Supported platforms: Linux (systemd), macOS (launchd)"
));
}
let config = load_config_or_default()?;
let manager = get_service_manager(&config.boot_mode)?;
if manager.is_installed()? {
if args.dry_run {
println!(
"Would reinstall service at: {}",
manager.service_file_path().display()
);
return Ok(());
}
if !args.force {
let confirm = Confirm::new()
.with_prompt("Service already installed. Reinstall?")
.default(false)
.interact()?;
if !confirm {
println!("Aborted.");
return Ok(());
}
let spinner = CommandSpinner::new_maybe("Removing existing service...", quiet);
manager.uninstall()?;
spinner.success("Existing service removed");
} else {
manager.uninstall()?;
}
} else if args.dry_run {
println!(
"Would install service at: {}",
manager.service_file_path().display()
);
return Ok(());
}
let spinner = CommandSpinner::new_maybe("Installing service...", quiet);
let executable_path = std::env::current_exe()?;
let service_config = ServiceConfig {
executable_path,
restart_retries: config.restart_retries,
restart_delay: config.restart_delay,
boot_mode: config.boot_mode.clone(),
};
let result = manager.install(&service_config)?;
spinner.success("Service installed");
if !quiet {
println!();
println!(
"Service file: {}",
style(result.service_file_path.display()).dim()
);
println!("Service name: {}", result.service_name);
if result.started {
println!("Status: {}", style("running").green());
}
println!();
let boot_desc = if config.boot_mode == "system" {
"boot"
} else {
"login"
};
println!("The service will start automatically on {boot_desc}.");
}
Ok(())
}