/**
 * Seed CLI — crea el primer superadmin de Novasis Pay.
 *
 * Uso:
 *   pnpm seed:admin --email admin@empresa.com --name "Nombre Apellido" --password "supersecreto"
 *
 * Idempotente: si el email ya existe, no lo modifica. Lee .env vía dotenv-cli o
 * usá las variables del entorno directamente.
 */
import "reflect-metadata";
import { NestFactory } from "@nestjs/core";
import { AppModule } from "../src/app.module";
import { AdminAuthService } from "../src/admin-auth/admin-auth.service";

interface Args {
  email: string;
  name: string;
  password: string;
}

function parseArgs(argv: string[]): Args {
  const out: Partial<Args> = {};
  for (let i = 0; i < argv.length; i++) {
    const arg = argv[i];
    if (arg === "--email") out.email = argv[++i];
    else if (arg === "--name") out.name = argv[++i];
    else if (arg === "--password") out.password = argv[++i];
  }
  const missing: string[] = [];
  if (!out.email) missing.push("--email");
  if (!out.name) missing.push("--name");
  if (!out.password) missing.push("--password");
  if (missing.length) {
    console.error(`Faltan argumentos: ${missing.join(", ")}`);
    console.error(
      'Uso: pnpm seed:admin --email a@b.com --name "Nombre" --password "secreto"',
    );
    process.exit(1);
  }
  if (out.password!.length < 8) {
    console.error("La password debe tener al menos 8 caracteres.");
    process.exit(1);
  }
  return out as Args;
}

async function main() {
  const args = parseArgs(process.argv.slice(2));
  const app = await NestFactory.createApplicationContext(AppModule, {
    logger: ["error", "warn"],
  });
  try {
    const service = app.get(AdminAuthService);
    const result = await service.bootstrapFirstAdmin(args);
    if (result.created) {
      console.log(`✓ Superadmin creado: ${result.user.email} (${result.user.id})`);
    } else {
      console.log(`• Ya existía: ${result.user.email} (${result.user.id}) — sin cambios`);
    }
  } finally {
    await app.close();
  }
}

main().catch((err) => {
  console.error("Error en seed-admin:", err);
  process.exit(1);
});
