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

// Mutation sensible → déléguée au backend missioflow-app (Option B : jamais de
// write DB direct depuis le panel). Proxifie l'endpoint sysop dédié livré le
// 2026-06-12 (mf_ask #150, point 1) :
//   POST /api/sysop/reactivate_tenant.php  { tenant_id, note? }  (Bearer super-admin)
// Effet backend : tenants.status → active, retention_until → NULL, AUCUNE
// interaction Stripe (le déblocage manuel suppose un paiement déjà encaissé).
// L'audit panel (logActivity) est obligatoire de notre côté ; le backend pose
// en plus son propre breadcrumb serveur.

type ReactivateOk = {
  success: true;
  data: {
    outcome: "reactivated" | "already_active";
    tenant_id: number;
    slug: string;
    previous_status?: string;
    status: "active";
  };
};

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 },
    );
  }

  // Note/justificatif optionnelle (réf. preuve de paiement). Body absent ou
  // invalide = pas de note, on n'échoue pas pour autant.
  let note: string | undefined;
  try {
    const body = (await req.json()) as { note?: unknown } | null;
    if (body && typeof body.note === "string" && body.note.trim()) {
      note = body.note.trim().slice(0, 500);
    }
  } catch {
    // pas de corps JSON : déblocage sans note
  }

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

    // Audit obligatoire côté panel (mitigation 2 AGENTS.md) : qui a débloqué
    // quel tenant, depuis quel état, avec quelle justification.
    void logActivity({
      type: "superadmin.tenant_reactivate",
      title: `Réactivation manuelle tenant #${id} (${res.data.slug})`,
      description: [
        `outcome=${res.data.outcome}`,
        res.data.previous_status ? `from=${res.data.previous_status}` : null,
        note ? `note=${note}` : null,
      ]
        .filter(Boolean)
        .join(" · "),
      tenant_id: id,
      user_id: session.user.id,
    });

    return NextResponse.json(res);
  } catch (err) {
    if (err instanceof ApiError) {
      // Le backend discrimine déjà les cas (404 TENANT_NOT_FOUND, 422
      // INVALID_TENANT_ID, 401/403, 500 error_id) : on relaie tel quel pour
      // que l'UI affiche un retour précis.
      return NextResponse.json(
        err.payload ?? { success: false, error: "UPSTREAM_ERROR" },
        { status: err.status },
      );
    }
    return NextResponse.json(
      { success: false, error: "BACKEND_UNAVAILABLE" },
      { status: 502 },
    );
  }
}
