// src/lib/active-org.ts — resolves the current org/user from the Better Auth session.

import { headers } from "next/headers";
import { cache } from "react";
import { auth } from "./auth";
import { resolveDefaultOrgId } from "./org/default-org";

// Deduped per request (React cache) so the root layout (lang resolution) and the
// (app) layout don't each re-read the session/org.
export const getActiveOrgId = cache(async (): Promise<string> => {
  const reqHeaders = await headers();
  const session = await auth.api.getSession({ headers: reqHeaders });
  const orgId = session?.session.activeOrganizationId;
  if (orgId) return orgId;
  // Self-heal : une session authentifiée peut naître SANS org active (signup
  // one-shot magic link — le hook session.create court avant la fin du
  // bootstrap d'org, voir auth.ts). Plutôt que de hard-throw (ce qui 500'ait
  // toute page (app)), on re-résout avec la même règle que le hook et on
  // répare la session pour les requêtes suivantes.
  if (!session?.user?.id) throw new Error("No active organization in session");
  const resolved = await resolveDefaultOrgId(session.user.id);
  if (!resolved) throw new Error("No active organization in session");
  try {
    await auth.api.setActiveOrganization({
      headers: reqHeaders,
      body: { organizationId: resolved },
    });
  } catch (err) {
    // Best-effort : même si la persistance échoue, la requête courante est
    // servie avec l'org résolue ; on retentera à la prochaine requête.
    console.error("[active-org] setActiveOrganization self-heal failed:", err);
  }
  return resolved;
});

export async function getActiveUserId(): Promise<string> {
  const session = await auth.api.getSession({ headers: await headers() });
  if (!session?.user) throw new Error("Not authenticated");
  return session.user.id;
}
