import { promises as fs } from "fs";
import path from "path";

const DATA_DIR = path.join(process.cwd(), "data");
const HEARTBEAT_FILE = path.join(DATA_DIR, "scheduler-heartbeat.json");

export type SchedulerTickSource = "poller" | "manual" | "cron_api" | "monitor";

export interface SchedulerHeartbeat {
  lastTickAt: string;
  lastPollerStartAt: string | null;
  source: SchedulerTickSource;
  pid: number;
}

async function ensureDataDir() {
  await fs.mkdir(DATA_DIR, { recursive: true });
}

export async function writeSchedulerHeartbeat(
  source: SchedulerTickSource,
  options?: { pollerStarted?: boolean },
): Promise<SchedulerHeartbeat> {
  await ensureDataDir();

  let previous: SchedulerHeartbeat | null = null;
  try {
    const raw = await fs.readFile(HEARTBEAT_FILE, "utf-8");
    previous = JSON.parse(raw) as SchedulerHeartbeat;
  } catch {
    // no prior heartbeat
  }

  const now = new Date().toISOString();
  const entry: SchedulerHeartbeat = {
    lastTickAt: now,
    lastPollerStartAt:
      options?.pollerStarted === true
        ? now
        : previous?.lastPollerStartAt ?? null,
    source,
    pid: process.pid,
  };

  await fs.writeFile(HEARTBEAT_FILE, `${JSON.stringify(entry, null, 2)}\n`, "utf-8");
  return entry;
}

export async function readSchedulerHeartbeat(): Promise<SchedulerHeartbeat | null> {
  try {
    const raw = await fs.readFile(HEARTBEAT_FILE, "utf-8");
    return JSON.parse(raw) as SchedulerHeartbeat;
  } catch {
    return null;
  }
}
