// Lecture du statut des jobs d'export RGPD (portabilité art. 20) d'un tenant.
// Table `tenant_export_jobs` livrée par missioflow-app (migration
// 2026-06-10_rgpd_export_jobs.sql). Lecture en DB directe via `superadmin_ro`
// (couverte par le GRANT SELECT global au niveau base, confirmé mf #151).
//
// Découpe Option B : le STATUT se lit ici (DB directe), mais le DÉCLENCHEMENT
// et le DOWNLOAD passent par les endpoints sysop de missioflow-app (mutations /
// accès fichier gardés par SuperAdminGuard). On ne lit JAMAIS
// `download_token_hash` — inutile côté panel avec le download relayé.

import "server-only";
import { query } from "../connection";

export type RgpdExportStatus =
  | "pending"
  | "processing"
  | "completed"
  | "failed";

export type RgpdExportJob = {
  id: number;
  tenant_id: number;
  status: RgpdExportStatus;
  file_size: number | null; // octets, renseigné quand completed
  expires_at: Date | null; // au-delà : ZIP purgé, download → 410
  created_at: Date;
  completed_at: Date | null;
  error_message: string | null; // renseigné quand failed
};

// Dernier job d'export connu pour ce tenant (le plus récent par created_at).
// Le déclencheur étant idempotent côté backend, il y a au plus un job
// pending/processing en vol à un instant donné — le plus récent suffit donc à
// piloter l'UI (en cours / téléchargeable / échoué).
//
// Défensif : tant que la migration `tenant_export_jobs` n'est pas appliquée en
// prod (déploiement app en cours au 2026-06-12), la table peut être absente.
// On renvoie alors `null` plutôt que de faire planter tout le détail tenant
// (getTenantDetail enchaîne ses requêtes en Promise.all — une exception ici
// rejetterait l'ensemble). Le code distingue ce cas de l'absence de job.
export async function getLatestExportJob(
  tenantId: number,
): Promise<RgpdExportJob | null> {
  try {
    const rows = await query<RgpdExportJob>(
      `SELECT id, tenant_id, status, file_size, expires_at,
              created_at, completed_at, error_message
         FROM tenant_export_jobs
        WHERE tenant_id = ?
        ORDER BY created_at DESC
        LIMIT 1`,
      [tenantId],
    );
    return rows[0] ?? null;
  } catch (err) {
    // ER_NO_SUCH_TABLE (1146) : migration pas encore déployée — dégradation
    // silencieuse, l'UI affichera simplement « aucun export ». Toute autre
    // erreur SQL est inattendue : on la log mais on ne casse pas le détail.
    const code = (err as { code?: string }).code;
    if (code !== "ER_NO_SUCH_TABLE") {
      console.warn(
        "[rgpd-exports] lecture tenant_export_jobs échouée:",
        (err as Error).message,
      );
    }
    return null;
  }
}
