import { NextResponse } from "next/server";
import { cookies } from "next/headers";
import { apiFetch, ApiError } from "@/lib/api/client";
import { setSession } from "@/lib/auth/session";
import type {
  SuperAdminUser,
  TotpChallengeResponse,
} from "@/lib/api/types";

// 2e étape du login pour les super-admins avec 2FA actif. Le challenge_token
// est posé en cookie httpOnly temporaire (5 min) par /api/auth/login dès que
// le backend renvoie `requires_totp: true`. Cette route consomme ce cookie +
// le code TOTP saisi, appelle le backend qui émet l'access_token Bearer, et
// le pose en session.
//
// PAS de Bearer JWT requis ici (l'utilisateur est en cours d'auth, pas encore
// connecté). Le seul secret consommé est le challenge_token côté cookie.

const CHALLENGE_COOKIE = "mf_totp_challenge";
const DEVICE_NAME = "missioflow-SuperAdmin";

export async function POST(request: Request) {
  let payload: { code?: unknown };
  try {
    payload = await request.json();
  } catch {
    return NextResponse.json(
      { success: false, error: "Requête invalide" },
      { status: 400 },
    );
  }

  const code = typeof payload.code === "string" ? payload.code.trim() : "";
  if (!/^\d{6}$/.test(code)) {
    return NextResponse.json(
      { success: false, error: "Code à 6 chiffres requis" },
      { status: 400 },
    );
  }

  const store = await cookies();
  const challengeToken = store.get(CHALLENGE_COOKIE)?.value;
  if (!challengeToken) {
    return NextResponse.json(
      {
        success: false,
        error: "Session de connexion expirée. Recommence depuis l'email.",
      },
      { status: 410 },
    );
  }

  try {
    const body = await apiFetch<TotpChallengeResponse>(
      "/mobile/totp/challenge.php",
      {
        method: "POST",
        body: {
          challenge_token: challengeToken,
          code,
          device_name: DEVICE_NAME,
        },
      },
    );

    if (!body.success || !body.data?.access_token || !body.data.user) {
      // Le backend brûle le challenge_token après 1 tentative — on clear le
      // cookie pour forcer un retour à l'écran email/password.
      store.delete(CHALLENGE_COOKIE);
      return NextResponse.json(
        { success: false, error: body.message ?? "Code invalide" },
        { status: 401 },
      );
    }

    const u = body.data.user;
    const normalizedUser: SuperAdminUser = {
      id: u.id,
      email: u.email,
      name: u.name,
      role: u.role,
      user_type: u.user_type,
      tenant_id: u.tenant_id,
      is_superadmin: true,
    };
    await setSession({
      token: body.data.access_token,
      refreshToken: body.data.refresh_token,
      user: normalizedUser,
    });
    store.delete(CHALLENGE_COOKIE);
    return NextResponse.json({ success: true, user: normalizedUser });
  } catch (err) {
    if (err instanceof ApiError && (err.status === 401 || err.status === 410)) {
      store.delete(CHALLENGE_COOKIE);
      return NextResponse.json(
        { success: false, error: "Code invalide ou session expirée" },
        { status: 401 },
      );
    }
    if (err instanceof ApiError) {
      return NextResponse.json(
        { success: false, error: err.message ?? "Erreur backend" },
        { status: err.status },
      );
    }
    console.error("[auth/totp/challenge] upstream error:", err);
    return NextResponse.json(
      { success: false, error: "Service d'authentification indisponible" },
      { status: 502 },
    );
  }
}
