// src/lib/gsc/health-actions.ts — agrégat « santé » de la page /gsc :
// dernière sync GSC par site de l'org (max(keywords.gsc->>'updatedAt'), même
// source que getKeywordsSyncStatus) + derniers runs du worker Rust de
// snapshots. Les runs vivent dans une table GLOBALE (cross-tenant, non scopée
// org) : décision Bastien 2026-07-23 — ils ne sont servis qu'aux super-admins
// de la plateforme (pas aux owner/admin d'org, qui ne verraient que du bruit
// d'autres tenants). Le flag isSuperAdmin est renvoyé pour piloter le rendu.
"use server";
import { desc, eq, inArray, sql } from "drizzle-orm";
import { getActiveOrgId } from "@/lib/active-org";
import { isCurrentUserSuperAdmin } from "@/lib/auth/super-admin";
import { db } from "@/lib/db/client";
import {
  gscSnapshotRuns,
  keywords,
  sites as sitesTable,
} from "@/lib/db/domain-schema";
import type { GscHealth } from "./health";

const RUNS_LIMIT = 7;

export async function getGscHealthAction(): Promise<GscHealth> {
  const orgId = await getActiveOrgId();
  const siteRows = await db
    .select({ id: sitesTable.id })
    .from(sitesTable)
    .where(eq(sitesTable.orgId, orgId));
  const siteIds = siteRows.map((r) => r.id);

  const syncRows = siteIds.length
    ? await db
        .select({
          siteId: keywords.siteId,
          lastGscSyncAt: sql<
            string | null
          >`max((${keywords.gsc}->>'updatedAt'))`,
        })
        .from(keywords)
        .where(inArray(keywords.siteId, siteIds))
        .groupBy(keywords.siteId)
    : [];
  const syncMap = new Map(syncRows.map((r) => [r.siteId, r.lastGscSyncAt]));
  const syncBySite = siteIds.map((siteId) => ({
    siteId,
    lastGscSyncAt: syncMap.get(siteId) ?? null,
  }));

  const isSuperAdmin = await isCurrentUserSuperAdmin();
  const snapshotRuns = isSuperAdmin
    ? await db
        // Projection EXPLICITE pinnée sur le type GscSnapshotRun : on ne sert
        // que les colonnes du contrat, pas `select()` (qui suivrait la table).
        .select({
          id: gscSnapshotRuns.id,
          startedAt: gscSnapshotRuns.startedAt,
          finishedAt: gscSnapshotRuns.finishedAt,
          sitesOk: gscSnapshotRuns.sitesOk,
          sitesFailed: gscSnapshotRuns.sitesFailed,
          rowsUpserted: gscSnapshotRuns.rowsUpserted,
          error: gscSnapshotRuns.error,
        })
        .from(gscSnapshotRuns)
        .orderBy(desc(gscSnapshotRuns.startedAt))
        .limit(RUNS_LIMIT)
    : [];

  return { syncBySite, snapshotRuns, isSuperAdmin };
}
