#!/usr/bin/env ts-node
/**
 * CLI script to onboard a new tenant from a JSON file.
 *
 * Usage:
 *   npx ts-node src/cli/onboard-tenant.ts path/to/tenant.json
 *
 * JSON format:
 *   {
 *     "tenant_name": "Mellow Travels",
 *     "subdomain": "mellow",
 *     "admin_name": "Mellow Admin",
 *     "admin_email": "admin@mellow.com",
 *     "admin_password": "Admin@123"
 *   }
 *
 * The script bootstraps the NestJS app, calls TenantService.onboard(),
 * then exits. All seeding (roles, permissions, settings, currencies, etc.)
 * happens automatically via the existing onboard flow.
 */
import { NestFactory } from '@nestjs/core';
import { AppModule } from '../app.module';
import { TenantService } from '../modules/tenant/tenant.service';
import * as fs from 'fs';
import * as path from 'path';

async function main() {
  const filePath = process.argv[2];

  if (!filePath) {
    console.error('❌ Usage: npx ts-node src/cli/onboard-tenant.ts <path-to-tenant.json>');
    console.error('');
    console.error('JSON format:');
    console.error('  {');
    console.error('    "tenant_name": "Company Name",');
    console.error('    "subdomain": "company",');
    console.error('    "admin_name": "Admin User",');
    console.error('    "admin_email": "admin@company.com",');
    console.error('    "admin_password": "SecurePass@123"');
    console.error('  }');
    process.exit(1);
  }

  const absolutePath = path.resolve(filePath);

  if (!fs.existsSync(absolutePath)) {
    console.error(`❌ File not found: ${absolutePath}`);
    process.exit(1);
  }

  let tenantData: any;
  try {
    const raw = fs.readFileSync(absolutePath, 'utf-8');
    tenantData = JSON.parse(raw);
  } catch (err) {
    console.error(`❌ Invalid JSON in ${absolutePath}`);
    process.exit(1);
  }

  // Validate required fields
  const required = ['tenant_name', 'subdomain', 'admin_name', 'admin_email', 'admin_password'];
  const missing = required.filter((f) => !tenantData[f]);
  if (missing.length > 0) {
    console.error(`❌ Missing required fields: ${missing.join(', ')}`);
    process.exit(1);
  }

  console.log('🚀 Bootstrapping NestJS application...');
  const app = await NestFactory.createApplicationContext(AppModule, { logger: ['error'] });

  const tenantService = app.get(TenantService);

  console.log(`📦 Onboarding tenant: ${tenantData.tenant_name} (${tenantData.subdomain})`);
  console.log(`👤 Admin: ${tenantData.admin_email}`);

  try {
    const result = await tenantService.onboard(tenantData);

    console.log('');
    console.log('✅ Tenant onboarded successfully!');
    console.log('─'.repeat(50));
    console.log(`  Tenant ID:   ${result.tenant.id}`);
    console.log(`  Name:        ${result.tenant.name}`);
    console.log(`  Subdomain:   ${result.tenant.subdomain}`);
    console.log(`  Admin ID:    ${result.admin.id}`);
    console.log(`  Admin Email: ${result.admin.email}`);
    console.log(`  Roles:       ${result.roles_seeded.join(', ')}`);
    console.log('─'.repeat(50));
    console.log('');
    console.log('💡 To use in frontend .env:');
    console.log(`  VITE_TENANT_ID=${result.tenant.id}`);
  } catch (err: any) {
    console.error(`❌ Onboarding failed: ${err.message}`);
    process.exit(1);
  }

  await app.close();
  process.exit(0);
}

main();
