/**
 * Emergency admin creator (PLANNING.md §3) — for when the bootstrap account is
 * lost and no one can log in to invite a replacement. Runs over SSH on the host.
 *
 *   npm run create-admin -- --name "Jane" --phone "+60123456789" \
 *     --email jane@example.com --role superadmin --password "…"
 *
 * `--password` is passed on the command line (visible in shell history) — change
 * it immediately after first login. `--role` defaults to `admin`.
 */
import { db, destroyDb } from '../src/lib/db';
import { newId } from '../src/lib/ulid';
import { normalizePhone } from '../src/lib/phone';
import { hashPassword } from '../src/modules/auth/password.service';

function flag(name: string): string | undefined {
  const i = process.argv.indexOf(`--${name}`);
  return i !== -1 ? process.argv[i + 1] : undefined;
}

async function main(): Promise<void> {
  const name = flag('name');
  const phone = flag('phone');
  const password = flag('password');
  const email = flag('email') ?? null;
  const role = flag('role') ?? 'admin';

  if (!name || !phone || !password) {
    console.error(
      'Usage: npm run create-admin -- --name "…" --phone "+60…" --password "…" [--email …] [--role admin|superadmin]',
    );
    process.exit(1);
  }
  if (role !== 'admin' && role !== 'superadmin') {
    console.error(`Invalid --role "${role}" (expected admin | superadmin)`);
    process.exit(1);
  }
  if (password.length < 8) {
    console.error('Password must be at least 8 characters.');
    process.exit(1);
  }

  const { e164, display } = normalizePhone(phone);

  if (await db('admin_users').where({ phone: e164 }).first()) {
    console.error(`An admin with phone ${e164} already exists.`);
    process.exit(1);
  }

  const id = newId();
  await db('admin_users').insert({
    id,
    phone: e164,
    phone_display: display,
    email,
    name,
    password_hash: await hashPassword(password),
    role,
    status: 'active',
  });

  console.log(`Created ${role} "${name}" (${e164}) — id ${id}`);
  await destroyDb();
}

void main().catch(async (err) => {
  console.error(err instanceof Error ? err.message : err);
  await destroyDb();
  process.exit(1);
});
