import { cookies } from "next/headers";
import { createSbServer } from "@/lib/supabaseServer";

const isProd = process.env.NODE_ENV === "production";

/**
 * API pour définir l'organisation active
 * - Staff : peut sélectionner n'importe quelle organisation (avec vérification d'accès)
 * - Client : peut seulement sélectionner sa propre organisation
 */
export async function POST(req: Request) {
  const sb = createSbServer();
  const { data: { user } } = await sb.auth.getUser();
  
  if (!user) return new Response("Unauthorized", { status: 401 });

  // Vérifier si l'utilisateur est staff via la DB (plus fiable)
  let isStaff = false;
  try {
    const { data: staffData } = await sb
      .from("staff_users")
      .select("is_staff")
      .eq("user_id", user.id)
      .maybeSingle();
    isStaff = !!staffData?.is_staff;
  } catch {}

  // Fallback sur les métadonnées si pas trouvé en DB
  if (!isStaff) {
    isStaff = Boolean(
      (user?.user_metadata && (user.user_metadata.is_staff === true || user.user_metadata.role === "staff")) ||
      (user?.app_metadata && Array.isArray(user.app_metadata.roles) && user.app_metadata.roles.includes("staff"))
    );
  }

  const body = await req.json() as { org_id: string };
  if (!body?.org_id) return new Response("org_id required", { status: 400 });

  if (isStaff) {
    // Staff: vérifie l'accès via can_access_org
    const { data: ok } = await sb.rpc("can_access_org", { target: body.org_id as any });
    if (!ok) return new Response("Forbidden", { status: 403 });

    // Purge un éventuel ancien cookie global (path "/") qui pourrait polluer l'espace client
    try {
      cookies().set("active_org_id", "", { path: "/", maxAge: 0 });
    } catch {}

    // Pose le cookie disponible sur tout le site pour les staff
    cookies().set("active_org_id", body.org_id, {
      httpOnly: true,
      sameSite: "lax",
      path: "/",         // Cookie disponible partout pour les staff
      secure: isProd,
      maxAge: 60 * 60 * 8,   // 8h
    });
  } else {
    // Client non-staff: vérifier qu'il essaie de sélectionner SON organisation
    const { data: myOrg } = await sb.rpc("get_my_org").maybeSingle();
    if (!myOrg || (myOrg as any).id !== body.org_id) {
      return new Response("Forbidden: can only select your own organization", { status: 403 });
    }

    // Pose le cookie pour le client
    cookies().set("active_org_id", body.org_id, {
      httpOnly: true,
      sameSite: "lax",
      path: "/",
      secure: isProd,
      maxAge: 60 * 60 * 8,   // 8h
    });
  }

  // Invalide le cache /api/me pour éviter tout clignotement après switch
  try {
    cookies().set("me_cache_v1", "", { path: "/", maxAge: 0 });
  } catch {}

  return Response.json({ ok: true });
}