import { sql } from 'drizzle-orm';
import { createNeonHttpClient } from '@platform-modules/db/neon-http';
import type { Querier } from '@platform-modules/db';
import { authUsersCreationSql, userSessionsCreationSql, serviceTokensCreationSql } from '@platform-modules/auth/engine-custom';
import { applyFullSchema } from '../src/lib/install.js';

// Provisions every CMS-owned Postgres table in FK order on the deploy Neon branch.
// Composes existing *MigrationSql / apply*Schema fns (single source of truth).
// Split per-statement — REQUIRED on neon-http. Idempotent — safe to re-run.
// Auth tables (0a–0c) run first so the auth-status ALTER at the end of applyFullSchema succeeds.
// Run seed-admin.ts AFTER this script to insert the first admin user.

const STEPS = [
  'auth_users',
  'user_sessions',
  'service_tokens',
  'content_entries base',
  'content visibility + FTS',
  'content revisions',
  'content taxonomy',
  'comments',
  'forms',
  'notifications',
  'fields',
  'menus',
  'media',
  'audit',
  'auth_users status',
] as const;

async function main(): Promise<void> {
  const connectionString = process.env.DATABASE_URL?.trim();
  if (!connectionString) {
    throw new Error('apply-schema: DATABASE_URL is required');
  }
  const db = createNeonHttpClient({ connectionString, schema: {} }) as unknown as Querier;
  console.log('apply-schema: starting unified provisioning…');
  // Auth tables first (FK order: authUsers → userSessions → serviceTokens)
  await db.execute(sql.raw(authUsersCreationSql()));
  await db.execute(sql.raw(userSessionsCreationSql()));
  await db.execute(sql.raw(serviceTokensCreationSql()));
  // CMS tables + auth-status ALTER
  await applyFullSchema(db, 'postgres');
  for (const step of STEPS) {
    console.log(`apply-schema: ✓ ${step}`);
  }
  console.log('apply-schema: complete');
}

main().catch((error) => {
  console.error(error instanceof Error ? error.message : String(error));
  process.exitCode = 1;
});