import { NextResponse } from "next/server";
import { getSession } from "@/lib/auth/session";
import { apiFetch, ApiError } from "@/lib/api/client";
import { logActivity } from "@/lib/db/audit";

// Déclencheur d'export RGPD (portabilité art. 20) pour un tenant arbitraire,
// côté sysop. Cas d'usage : un tenant ne peut pas faire l'export self-service
// (connexion HS, blocage) → le super-admin l'extrait pour son compte (mf #151).
//
// Mutation → déléguée au backend missioflow-app (Option B : jamais de write DB
// direct). Proxifie l'endpoint sysop livré le 2026-06-12 :
//   POST /api/sysop/rgpd_export_trigger.php  { tenant_id }  (Bearer super-admin)
// Idempotent côté backend : un job pending/processing déjà en vol est renvoyé
// (outcome=already_running) plutôt qu'empilé. Le worker cron génère ensuite le
// ZIP. Le STATUT se lit en DB directe (cf. getLatestExportJob) ; ici on ne fait
// que créer le job.

type TriggerOk = {
  success: true;
  data: {
    outcome: "created" | "already_running";
    tenant_id: number;
    job_id: number;
    status: "pending" | "processing" | "completed" | "failed";
  };
};

export async function POST(
  _req: Request,
  { params }: { params: Promise<{ id: string }> },
) {
  const session = await getSession();
  if (!session?.user.is_superadmin) {
    return NextResponse.json(
      { success: false, error: "FORBIDDEN" },
      { status: 403 },
    );
  }

  const { id: idStr } = await params;
  const id = Number.parseInt(idStr, 10);
  if (!Number.isFinite(id) || id <= 0) {
    return NextResponse.json(
      { success: false, error: "INVALID_ID" },
      { status: 400 },
    );
  }

  try {
    const res = await apiFetch<TriggerOk>("/sysop/rgpd_export_trigger.php", {
      method: "POST",
      token: session.token,
      body: { tenant_id: id },
    });

    // Audit obligatoire côté panel (mitigation 2 AGENTS.md) : qui a déclenché
    // un export des données d'un tenant, et avec quel résultat (création vs job
    // déjà en vol). L'extraction RGPD est une donnée sensible — la tracer.
    void logActivity({
      type: "superadmin.tenant_rgpd_export_trigger",
      title: `Export RGPD déclenché — tenant #${id}`,
      description: `outcome=${res.data.outcome} · job_id=${res.data.job_id} · status=${res.data.status}`,
      tenant_id: id,
      user_id: session.user.id,
    });

    // Le backend renvoie 202 (created) ou 200 (already_running). On relaie le
    // payload tel quel ; l'UI relit ensuite le statut frais en DB directe.
    return NextResponse.json(res, {
      status: res.data.outcome === "created" ? 202 : 200,
    });
  } catch (err) {
    if (err instanceof ApiError) {
      // Cas discriminés par le backend : 404 TENANT_NOT_FOUND, 422
      // INVALID_TENANT_ID, 401/403 auth, 500 error_id. Relayés tels quels.
      return NextResponse.json(
        err.payload ?? { success: false, error: "UPSTREAM_ERROR" },
        { status: err.status },
      );
    }
    return NextResponse.json(
      { success: false, error: "BACKEND_UNAVAILABLE" },
      { status: 502 },
    );
  }
}
