/**
 * Wipe-all runner — executes scripts/wipe-all.sql against whatever
 * DB the backend .env points at (local dev or production server).
 *
 * Usage:
 *   npm run db:wipe                    # uses .env
 *   DB_HOST=prod.db npm run db:wipe    # or override inline
 *
 * Safety:
 *   - Requires CONFIRM_WIPE=YES env var to actually run; otherwise
 *     prints the plan and exits. Prevents accidental prod wipes.
 *   - Runs the SQL in a single transaction — any failure rolls back.
 *   - Preserves: tenants, tenant_settings, users, roles,
 *     role_permissions, currencies, service_types, tax_types,
 *     vehicle_types. Everything else for every tenant is cleared.
 */

import { DataSource } from 'typeorm';
import * as fs from 'node:fs';
import * as path from 'node:path';
import * as dotenv from 'dotenv';

dotenv.config();

const SQL_FILE = path.resolve(__dirname, 'wipe-all.sql');

async function main() {
  const sql = fs.readFileSync(SQL_FILE, 'utf8');

  const host = process.env.DB_HOST || 'localhost';
  const port = Number(process.env.DB_PORT || 5432);
  const username = process.env.DB_USERNAME || 'postgres';
  const database = process.env.DB_NAME || 'dmc_ops';

  console.log('================================================');
  console.log(' DMC db:wipe — deletes ALL user-generated data ');
  console.log('================================================');
  console.log(` host: ${host}:${port}`);
  console.log(` db:   ${database}`);
  console.log(` user: ${username}`);
  console.log('');
  console.log(' Will KEEP: tenants, users, roles, currencies,');
  console.log('            service_types, tax_types, vehicle_types,');
  console.log('            tenant_settings.');
  console.log(' Will WIPE: every destination/hotel/transport/activity/');
  console.log('            supplier/driver/vehicle/season/pricing row');
  console.log('            PLUS every query/quote/booking/payment/');
  console.log('            item/notification/audit row.');
  console.log('');

  if (process.env.CONFIRM_WIPE !== 'YES') {
    console.log('⚠  Dry-run mode. Re-run with CONFIRM_WIPE=YES to execute.');
    console.log('   e.g.  CONFIRM_WIPE=YES npm run db:wipe');
    process.exit(0);
  }

  const ds = new DataSource({
    type: 'postgres',
    host,
    port,
    username,
    password: process.env.DB_PASSWORD || '',
    database,
  });

  await ds.initialize();
  console.log('→ connected, executing...');
  try {
    const result = await ds.query(sql);
    // Last statement in wipe-all.sql is a SELECT that returns the
    // row counts we preserved — surface it so you can eyeball it.
    if (Array.isArray(result) && result.length) {
      console.log('\nPreserved rows after wipe:');
      console.table(result);
    }
  } finally {
    await ds.destroy();
  }
  console.log('✓ wipe complete');
}

main().catch((err) => {
  console.error('✗ wipe failed:', err.message);
  process.exit(1);
});
