import 'dotenv/config';
import { input, password, confirm } from '@inquirer/prompts';
import argon2 from 'argon2';
import { createPrismaClient } from '../prisma/client.js';
import { emailSchema, passwordSchema } from '../shared/contracts.js';
import { passwordOptions } from '../server/auth.js';

const command = process.argv[2];
if (!['create', 'reset-password', 'deactivate'].includes(command)) throw new Error('Usage: npm run admin -- create|reset-password|deactivate');
if (!process.stdin.isTTY) throw new Error('Run this command in an interactive terminal; passwords are prompted securely.');
if (!process.env.DATABASE_URL) throw new Error('Set DATABASE_URL.');
const db = createPrismaClient(process.env.DATABASE_URL);
try {
  const email = emailSchema.parse(await input({ message: 'Email admin:' }));
  if (command === 'deactivate') {
    if (await confirm({ message: `Nonaktifkan ${email}?`, default: false })) {
      await db.adminUser.update({ where: { email }, data: { active: false, authVersion: { increment: 1 } } });
      console.log('Admin dinonaktifkan.');
    }
  } else {
    const name = command === 'create' ? await input({ message: 'Nama:', validate: v => v.trim().length > 0 && v.length <= 300 || 'Nama wajib diisi (maks. 300 karakter)' }) : undefined;
    const value = passwordSchema.parse(await password({ message: 'Kata sandi (minimal 12 karakter):', mask: '*' }));
    const repeated = await password({ message: 'Ulangi kata sandi:', mask: '*' });
    if (value !== repeated) throw new Error('Kata sandi tidak sama.');
    const passwordHash = await argon2.hash(value, passwordOptions);
    if (command === 'create') await db.adminUser.create({ data: { email, name: name!.trim(), passwordHash } });
    else await db.adminUser.update({ where: { email }, data: { passwordHash, active: true, authVersion: { increment: 1 } } });
    console.log(command === 'create' ? 'Admin berhasil dibuat.' : 'Kata sandi diperbarui; sesi lama tidak berlaku.');
  }
} catch (error) {
  console.error(error instanceof Error && !('code' in error) ? error.message : 'Operasi gagal. Periksa email dan koneksi database.');
  process.exitCode = 1;
} finally { await db.$disconnect(); }
