vik 0.1.1

Vik is an issue-driven coding workflow automation tool.
//! Windows stub: foreground Ctrl-C only. Background detach + a real
//! SIGTERM equivalent lands later.

use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};

use tokio_util::sync::CancellationToken;

use crate::logging::Phase;

use super::SignalError;

pub fn send_sigterm(_pid: u32) -> std::io::Result<()> {
  Err(std::io::Error::other(
    "SIGTERM delivery is not supported on Windows yet",
  ))
}

pub fn pid_alive(_pid: u32) -> bool {
  false
}

pub fn install(shutdown: CancellationToken) -> Result<(), SignalError> {
  let forced = Arc::new(AtomicBool::new(false));
  let shutdown_clone = shutdown.clone();
  let forced_clone = Arc::clone(&forced);
  tokio::spawn(async move {
    loop {
      if tokio::signal::ctrl_c().await.is_err() {
        break;
      }
      if forced_clone.swap(true, Ordering::SeqCst) {
        tracing::error!(
            phase = %Phase::Daemon,
            signal = "ctrl_c",
            "second shutdown signal; aborting",
        );
        std::process::exit(130);
      }
      tracing::info!(
          phase = %Phase::Daemon,
          signal = "ctrl_c",
          "shutdown signal received; requesting graceful shutdown",
      );
      shutdown_clone.cancel();
    }
  });
  Ok(())
}