import { eq } from "drizzle-orm";
import { env } from "@/env";
import { auth } from "@/lib/auth";
import { db } from "@/lib/db";
import { organization, user } from "@/lib/db/auth-schema";
import { assertLocalDatabaseUrl } from "./guard";

export const DEV_USER = {
  email: "dev@seoinsight.local",
  password: "dev-password!",
  name: "Dev",
} as const;

export const DEV_ORG = { name: "Dev", slug: "dev" } as const;

async function ensureUser(): Promise<string> {
  const existing = await db.query.user.findFirst({
    where: eq(user.email, DEV_USER.email),
    columns: { id: true },
  });
  if (existing) {
    console.log(`utilisateur ${DEV_USER.email} : déjà présent (${existing.id})`);
    return existing.id;
  }
  const created = await auth.api.signUpEmail({ body: { ...DEV_USER } });
  console.log(`utilisateur ${DEV_USER.email} : créé (${created.user.id})`);
  return created.user.id;
}

async function ensureOrg(userId: string): Promise<string> {
  const existing = await db.query.organization.findFirst({
    where: eq(organization.slug, DEV_ORG.slug),
    columns: { id: true },
  });
  if (existing) {
    console.log(`organisation « ${DEV_ORG.name} » : déjà présente (${existing.id})`);
    return existing.id;
  }
  // Sans `headers`, Better Auth traite l'appel comme une action système : `userId` devient
  // le créateur et reçoit le rôle `owner`.
  const created = await auth.api.createOrganization({ body: { ...DEV_ORG, userId } });
  if (!created) throw new Error("Better Auth n'a pas renvoyé l'organisation créée");
  console.log(`organisation « ${DEV_ORG.name} » : créée (${created.id})`);
  return created.id;
}

async function main(): Promise<void> {
  assertLocalDatabaseUrl(env.DATABASE_URL);
  const userId = await ensureUser();
  const orgId = await ensureOrg(userId);
  console.log(`Seed auth OK — user_id=${userId}`);
  // Dernière ligne, format stable : c'est l'identifiant à passer à
  // `uv run python -m app.seed --org-id <id>` et `app.db_reset --org-id <id>`.
  // Rien n'est partagé entre les bases AUTH et DATA.
  console.log(`ORG_ID=${orgId}`);
}

// `process.exit` : le pool postgres.js de `@/lib/db` garderait le process bun ouvert.
main()
  .then(() => process.exit(0))
  .catch((error: unknown) => {
    console.error(error instanceof Error ? error.message : error);
    process.exit(1);
  });
