// src/lib/gsc/health.ts — types + dérivation pure du statut d'un run de
// snapshots GSC (worker Rust, table gsc_snapshot_runs). Pas d'I/O : testable
// en isolation, consommé par la card « Santé des snapshots » (/gsc).

export type SnapshotRunStatus = "ok" | "partial" | "failed" | "running";

export type GscSnapshotRun = {
  id: string;
  startedAt: Date;
  finishedAt: Date | null;
  sitesOk: number;
  sitesFailed: number;
  rowsUpserted: number;
  error: string | null;
};

export type GscSiteSync = { siteId: string; lastGscSyncAt: string | null };

export type GscHealth = {
  syncBySite: GscSiteSync[];
  snapshotRuns: GscSnapshotRun[];
  /** La card « Santé des snapshots » (table globale cross-tenant) n'est servie
   *  qu'aux super-admins plateforme — ce flag pilote son rendu côté page. */
  isSuperAdmin: boolean;
};

/** Statut d'un run : `running` tant que non terminé ; `failed` si erreur
 *  globale ou aucun site réussi ; `partial` si succès ET échecs ; `ok` sinon. */
export function snapshotRunStatus(run: {
  finishedAt: Date | null;
  sitesOk: number;
  sitesFailed: number;
  error: string | null;
}): SnapshotRunStatus {
  if (!run.finishedAt) return "running";
  if (run.error || (run.sitesFailed > 0 && run.sitesOk === 0)) return "failed";
  if (run.sitesFailed > 0) return "partial";
  return "ok";
}
