import { PrismaClient } from '@prisma/client';
import readline from 'node:readline';
import { generateDualQRCodes, getMeetingAttendanceBaseUrl } from '../../../backend/src/modules/meeting-attendance/utils/meeting-utils';

const prisma = new PrismaClient();

const args = new Set(process.argv.slice(2));
const onlyMissing = args.has('--only-missing');
const dryRun = args.has('--dry-run');

function askConfirm(question: string): Promise<string> {
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });

  return new Promise((resolve) => {
    rl.question(question, (answer) => {
      rl.close();
      resolve(answer.trim());
    });
  });
}

async function main() {
  const baseUrl = getMeetingAttendanceBaseUrl();
  const where = onlyMissing
    ? { OR: [{ qrCodeOnline: null }, { qrCodeOffline: null }] }
    : {};

  const meetings = await prisma.meeting.findMany({
    where,
    select: { id: true, qrCodeOnline: true, qrCodeOffline: true },
  });

  console.log(`Found ${meetings.length} meeting(s) to process.`);
  console.log(`Base URL: ${baseUrl}`);
  console.log(`Mode: ${onlyMissing ? 'only-missing' : 'all'} ${dryRun ? '(dry-run)' : ''}`);

  if (meetings.length === 0) {
    return;
  }

  if (dryRun) {
    console.log('Dry run enabled. No updates will be applied.');
    return;
  }

  const confirmation = await askConfirm('Type YES to regenerate QR codes: ');
  if (confirmation !== 'YES') {
    console.log('Aborted.');
    return;
  }

  let updated = 0;
  for (const meeting of meetings) {
    const qrCodes = await generateDualQRCodes(meeting.id, baseUrl);
    await prisma.meeting.update({
      where: { id: meeting.id },
      data: { qrCodeOnline: qrCodes.online, qrCodeOffline: qrCodes.offline },
    });
    updated += 1;
  }

  console.log(`Updated ${updated} meeting(s).`);
}

main()
  .catch((error) => {
    console.error('Failed to regenerate QR codes:', error);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
