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

const PUBLIC_PATHS = new Set<string>(["/login", "/nope"]);

const isPublic = (pathname: string): boolean => {
  if (PUBLIC_PATHS.has(pathname)) return true;
  if (pathname.startsWith("/api/auth/")) return true;
  return false;
};

// Lit l'IP du client en se fiant aux headers Traefik en prod, fallback dev.
// `x-forwarded-for` peut contenir une chaîne d'IPs ; le premier élément est
// le client réel quand on est derrière un seul proxy de confiance (Traefik).
function getClientIp(req: NextRequest): string | null {
  const xff = req.headers.get("x-forwarded-for");
  if (xff) return xff.split(",")[0].trim();
  const realIp = req.headers.get("x-real-ip");
  if (realIp) return realIp.trim();
  return null;
}

function getAllowlist(): string[] | null {
  const raw = process.env.SUPERADMIN_IP_ALLOWLIST?.trim();
  if (!raw) return null;
  const list = raw
    .split(",")
    .map((ip) => ip.trim())
    .filter(Boolean);
  return list.length > 0 ? list : null;
}

export function proxy(req: NextRequest) {
  const { pathname } = req.nextUrl;

  // /nope est toujours accessible — sinon on crée une boucle de redirection
  // pour les IP bloquées qui essaient de voir leur page d'erreur.
  if (pathname === "/nope") {
    return NextResponse.next();
  }

  // IP allowlist : appliquée AVANT le check session, donc même /login est
  // bloqué si l'IP n'est pas autorisée. Désactivée si l'env est vide
  // (utile en dev).
  const allowlist = getAllowlist();
  if (allowlist) {
    const clientIp = getClientIp(req);
    if (!clientIp || !allowlist.includes(clientIp)) {
      const url = req.nextUrl.clone();
      url.pathname = "/nope";
      url.search = "";
      return NextResponse.redirect(url);
    }
  }

  if (isPublic(pathname)) {
    return NextResponse.next();
  }

  const cookieName = process.env.SESSION_COOKIE_NAME || "mf_sysop_session";
  const token = req.cookies.get(cookieName)?.value;

  if (!token) {
    const url = req.nextUrl.clone();
    url.pathname = "/login";
    if (pathname !== "/") {
      url.searchParams.set("next", pathname);
    }
    return NextResponse.redirect(url);
  }

  return NextResponse.next();
}

export const config = {
  matcher: [
    "/((?!_next/static|_next/image|favicon.ico|robots.txt|.*\\.svg$|.*\\.png$|.*\\.jpg$).*)",
  ],
};
