use std::error::Error;
use std::fs::OpenOptions;
use std::process::{Command, Stdio};
pub async fn execute_daemon(host: &str, port: u16, background: bool) -> Result<(), Box<dyn Error>> {
if background {
println!("Starting server in the background...");
let log_dir = std::env::var("NEBU_LOG_DIR").unwrap_or_else(|_| "./logs".to_string());
std::fs::create_dir_all(&log_dir)?;
let timestamp = chrono::Local::now().format("%Y%m%d_%H%M%S");
let stdout_log = format!("{}/neblet_stdout_{}.log", log_dir, timestamp);
let stderr_log = format!("{}/neblet_stderr_{}.log", log_dir, timestamp);
let stdout_file = OpenOptions::new()
.write(true)
.create(true)
.append(true)
.open(&stdout_log)?;
let stderr_file = OpenOptions::new()
.write(true)
.create(true)
.append(true)
.open(&stderr_log)?;
let exe = std::env::current_exe()?;
let port_str = format!("{}", port);
let args = vec!["daemon", "--host", host, "--port", &port_str];
Command::new("nohup")
.arg(exe.clone())
.args(args.clone())
.spawn()?;
Command::new("nohup")
.arg(exe)
.args(args)
.stdout(Stdio::from(stdout_file))
.stderr(Stdio::from(stderr_file))
.spawn()?;
println!("Background server process started. You can safely exit this program.");
println!("Logs: stdout → {} | stderr → {}", stdout_log, stderr_log);
Ok(())
} else {
nebulous::neblet::daemon::run_server(host, port).await
}
}