import 'dotenv/config';
import 'reflect-metadata';
import { NestFactory } from '@nestjs/core';
import { eq } from 'drizzle-orm';
import { AppModule } from '@/app.module';
import { DbService } from '@/common/db/db.service';
import { plans, tenants } from '@/db/schema';
import { PlatformService } from '@/modules/platform/platform.service';
import { TenantProvisioningService } from '@/modules/platform/tenant-provisioning.service';
import { loadEnv } from '@/config/env';
import { runWithContext, systemContext } from '@/common/context/request-context';
import { D } from '@/common/util';

/**
 * Seeds reference data:
 *  - subscription plans
 *  - platform admin (PLATFORM_ADMIN_EMAIL / PLATFORM_ADMIN_PASSWORD)
 *  - with --demo: a demo tenant "demo" with admin demo@demo.local / Demo!Pass2026
 *
 * Safe to re-run: existing rows are left untouched.
 */
async function main() {
  const env = loadEnv();
  const app = await NestFactory.createApplicationContext(AppModule, { logger: ['error', 'warn', 'log'] });
  const db = app.get(DbService);
  const platform = app.get(PlatformService);
  const provisioning = app.get(TenantProvisioningService);

  await runWithContext(systemContext(null), async () => {
    const planDefs = [
      { code: 'STARTER', name: 'Starter', monthlyPrice: '299', limits: { maxWarehouses: 1, maxUsers: 10, maxStorers: 5, maxOrdersPerMonth: 5000, maxApiCallsPerDay: 20000, aiTokensPerMonth: 0 }, features: ['billing.3pl', 'integrations.api', 'outbound.waves'] },
      { code: 'GROWTH', name: 'Growth', monthlyPrice: '899', limits: { maxWarehouses: 3, maxUsers: 40, maxStorers: 25, maxOrdersPerMonth: 50000, maxApiCallsPerDay: 200000, aiTokensPerMonth: 2000000 }, features: ['billing.3pl', 'integrations.api', 'integrations.webhooks', 'outbound.waves', 'inventory.serials', 'customer_portal', 'ai.document_intake', 'ai.anomaly_detection', 'ai.nl_query'] },
      { code: 'ENTERPRISE', name: 'Enterprise', monthlyPrice: '2500', limits: { maxWarehouses: 50, maxUsers: 1000, maxStorers: 1000, maxOrdersPerMonth: 10000000, maxApiCallsPerDay: 5000000, aiTokensPerMonth: 20000000 }, features: ['billing.3pl', 'integrations.api', 'integrations.webhooks', 'integrations.sap', 'outbound.waves', 'inventory.serials', 'customer_portal', 'ai.document_intake', 'ai.anomaly_detection', 'ai.nl_query', 'ai.slotting', 'ai.forecast'] },
    ];
    await db.runBypass(async (tx) => {
      for (const p of planDefs) {
        const [existing] = await tx.select({ id: plans.id }).from(plans).where(eq(plans.code, p.code)).limit(1);
        if (!existing) await tx.insert(plans).values({ ...p, monthlyPrice: D(p.monthlyPrice), currency: 'USD' });
      }
    });
    console.log('Plans ready');

    if (env.PLATFORM_ADMIN_EMAIL && env.PLATFORM_ADMIN_PASSWORD) {
      await platform.ensureBootstrapAdmin(env.PLATFORM_ADMIN_EMAIL, env.PLATFORM_ADMIN_PASSWORD);
      console.log(`Platform admin ready: ${env.PLATFORM_ADMIN_EMAIL}`);
    }

    if (process.argv.includes('--demo')) {
      const exists = await db.runBypass(async (tx) => (await tx.select({ id: tenants.id }).from(tenants).where(eq(tenants.code, 'demo')).limit(1))[0]);
      if (!exists) {
        await provisioning.provision({
          code: 'demo',
          name: 'Demo Logistics Co.',
          planCode: 'ENTERPRISE',
          timezone: 'Asia/Kuwait',
          currency: 'KWD',
          locale: 'en',
          adminEmail: 'demo@demo.local',
          adminName: 'Demo Admin',
          adminPassword: 'Demo!Pass2026',
          firstWarehouse: { code: 'KW1', name: 'Kuwait Main Warehouse' },
          trialDays: 0,
        });
        console.log('Demo tenant provisioned: tenant code "demo", login demo@demo.local / Demo!Pass2026');
      } else {
        console.log('Demo tenant already exists');
      }
    }
  });
  await app.close();
}

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