/**
 * csrf.ts — CSRF protection helper untuk Next.js API routes
 *
 * Strategi: Origin/Referer header validation.
 * Cocok untuk SameSite browser requests — mencegah cross-site form submission.
 *
 * Cara kerja:
 *   Browser selalu menyertakan `Origin` (atau `Referer`) pada cross-site requests.
 *   Kita reject request yang Origin-nya tidak cocok dengan APP_URL kita.
 *   Same-origin requests (dari browser yang sama) tetap diizinkan.
 *
 * Catatan:
 *   - Server-to-server requests (curl, Postman, dsb) tidak punya Origin → diizinkan
 *     karena bukan ancaman CSRF (attacker tidak bisa kirim cookie user dari server mereka).
 *   - Jika butuh proteksi lebih ketat untuk public API, gunakan CSRF token di body/header.
 */

import type { NextRequest } from "next/server";

/**
 * Validasi apakah request berasal dari origin yang diizinkan.
 * Return `true` jika aman, `false` jika perlu di-reject.
 */
export function isCsrfSafe(request: NextRequest): boolean {
  const origin = request.headers.get("origin");

  // Jika tidak ada Origin header → bukan browser request (curl/server/Postman)
  // Tidak perlu CSRF protection untuk ini.
  if (!origin) return true;

  // Daftar origin yang diizinkan
  const appUrl = process.env.NEXT_PUBLIC_APP_URL ?? "";
  const allowedOrigins = new Set<string>(
    [
      appUrl,
      // Izinkan localhost di semua port untuk development
      "http://localhost:3000",
      "http://localhost:3001",
      "http://127.0.0.1:3000",
    ].filter(Boolean)
  );

  // Cek exact match (termasuk protocol + domain + port)
  if (allowedOrigins.has(origin)) return true;

  // Cek apakah origin adalah subdomain dari APP_URL (misal preview deployments)
  try {
    const originHost  = new URL(origin).hostname;
    const appUrlHost  = appUrl ? new URL(appUrl).hostname : "";

    // Izinkan subdomain dari domain utama (misal: *.vercel.app untuk preview)
    if (appUrlHost && (originHost === appUrlHost || originHost.endsWith(`.${appUrlHost}`))) {
      return true;
    }
  } catch {
    // URL parsing gagal → reject
    return false;
  }

  return false;
}

/**
 * Shorthand response untuk CSRF rejection.
 * Import NextResponse di caller, atau gunakan helper ini jika sudah tersedia.
 */
export function csrfForbiddenPayload() {
  return { success: false, error: "Forbidden: invalid request origin" };
}
