import { PrismaClient } from '@prisma/client';
import { resetAndSeedDatabase } from './database-init';
import { resolveSeedMode } from './run-seed';

function assertInitAllowed() {
  if (process.argv.includes('--yes')) {
    process.env.INIT_DATABASE_CONFIRM = 'YES';
  }

  if (process.argv.includes('--dev')) {
    process.env.SEED_MODE = 'dev';
  }

  if (process.argv.includes('--production')) {
    process.env.SEED_MODE = 'production';
  }

  if (process.env.INIT_DATABASE_CONFIRM !== 'YES') {
    console.error(
      '[init-db] 拒绝执行：须设置 INIT_DATABASE_CONFIRM=YES 或传入 --yes 以确认清空全部业务数据。',
    );
    console.error('[init-db] 生产上线: pnpm db:reset:prod');
    console.error('[init-db] 本地演示: pnpm db:reset:dev');
    process.exit(1);
  }

  const isProd = process.env.NODE_ENV === 'production';
  if (isProd && process.env.ALLOW_DB_RESET !== 'true') {
    console.error(
      '[init-db] 生产环境须同时设置 ALLOW_DB_RESET=true（与管理端「重置数据库」相同策略）。',
    );
    process.exit(1);
  }
}

async function main() {
  assertInitAllowed();

  const mode = resolveSeedMode();
  const prisma = new PrismaClient();
  try {
    console.log(`[init-db] 正在清空全部业务表并重新 seed（mode=${mode}）…`);
    const result = await resetAndSeedDatabase(prisma, { mode });
    console.log('[init-db] 完成。保留账号：');
    for (const line of result.demoAccounts) {
      console.log(`  - ${line}`);
    }
    if (result.seedMode === 'production') {
      console.log('[init-db] 已写入 WC2026 赛事示例数据（无代理/玩家/充值/注单）。');
    }
  } finally {
    await prisma.$disconnect();
  }
}

main().catch((err) => {
  console.error(err);
  process.exit(1);
});
