interface SchedulerEnv {
  SCHEDULER_DO: DurableObjectNamespace;
}

interface SchedulerEnsureResult {
  ok: boolean;
  armed: boolean;
  nextAlarm: number | null;
}

interface SchedulerStatusResult {
  lastTick: number | null;
  nextAlarm: number | null;
  lastRun: Record<string, number>;
}

function getScheduler(env: SchedulerEnv) {
  return env.SCHEDULER_DO.get(env.SCHEDULER_DO.idFromName('singleton'));
}

async function schedulerRequest<T>(
  env: SchedulerEnv,
  path: string,
  method: 'GET' | 'POST',
): Promise<T> {
  const response = await getScheduler(env).fetch(`https://do${path}`, {
    method,
  });
  if (!response.ok) throw new Error(`SchedulerDO ${path} failed: ${response.status}`);
  return response.json() as Promise<T>;
}

export function ensureScheduler(env: SchedulerEnv): Promise<SchedulerEnsureResult> {
  return schedulerRequest(env, '/ensure', 'POST');
}

export function schedulerStatus(env: SchedulerEnv): Promise<SchedulerStatusResult> {
  return schedulerRequest(env, '/status', 'GET');
}

export function disarmScheduler(env: SchedulerEnv): Promise<{ ok: boolean }> {
  return schedulerRequest(env, '/disarm', 'POST');
}
