// src/lib/org/onboarding-org.test.ts — resolveOnboardingOrgId against REAL
// data in Postgres. Gated on DB_TESTS=1, test DB only.
import { beforeEach, describe, expect, it, mock } from "bun:test";

mock.module("server-only", () => ({}));

const RUN_DB = process.env.DB_TESTS === "1";

describe.skipIf(!RUN_DB)("resolveOnboardingOrgId (postgres)", () => {
  const USER = "onb-org-user-1";
  const ORG = "onb-org-org-1";

  // biome-ignore lint/suspicious/noExplicitAny: modules importés dynamiquement
  let db: any;
  // biome-ignore lint/suspicious/noExplicitAny: modules importés dynamiquement
  let authSchema: any;
  let resolveOnboardingOrgId: (
    userId: string,
    sessionOrgId: string | null | undefined,
  ) => Promise<string | null>;

  async function cleanup() {
    const { eq } = await import("drizzle-orm");
    await db
      .delete(authSchema.organization)
      .where(eq(authSchema.organization.id, ORG));
    await db.delete(authSchema.user).where(eq(authSchema.user.id, USER));
  }

  beforeEach(async () => {
    ({ db } = await import("@/lib/db/client"));
    authSchema = await import("@/lib/db/auth-schema");
    const { assertTestDb } = await import("@/lib/db/assert-test-db");
    await assertTestDb();
    ({ resolveOnboardingOrgId } = await import("./onboarding-org"));

    await cleanup();
    await db.insert(authSchema.user).values({
      id: USER,
      name: "Onb Org",
      email: "onb-org@example.test",
      emailVerified: true,
      createdAt: new Date(),
      updatedAt: new Date(),
    });
    await db.insert(authSchema.organization).values({
      id: ORG,
      name: "Onb Org",
      slug: "onb-org-slug",
      createdAt: new Date(),
    });
    await db.insert(authSchema.member).values({
      id: "onb-org-member-1",
      organizationId: ORG,
      userId: USER,
      role: "owner",
      createdAt: new Date(),
    });
  });

  it("retourne l'org de la session quand elle est présente", async () => {
    expect(await resolveOnboardingOrgId(USER, ORG)).toBe(ORG);
  });

  it("retombe sur l'org par défaut quand la session n'en porte pas", async () => {
    expect(await resolveOnboardingOrgId(USER, null)).toBe(ORG);
  });

  it("retourne null quand l'utilisateur n'a aucune organisation", async () => {
    const { eq } = await import("drizzle-orm");
    await db
      .delete(authSchema.organization)
      .where(eq(authSchema.organization.id, ORG));
    expect(await resolveOnboardingOrgId(USER, null)).toBeNull();
  });
});
