import { randomUUID } from 'node:crypto';
import type { RowDataPacket } from 'mysql2';
import { db } from './db';

/**
 * L'allowlist est la table `user` elle-même.
 *
 * Inviter quelqu'un, c'est créer sa ligne ; le révoquer, c'est la supprimer. Une
 * table `allowed_email` séparée serait une seconde source de vérité pouvant
 * contredire la première : un email autorisé sans compte, ou l'inverse.
 *
 * `user` est entouré de backticks : c'est un identifiant ambigu en MySQL.
 */
export async function isInvited(email: string): Promise<boolean> {
  const [rows] = await db.query<RowDataPacket[]>(
    'select id from `user` where email = ? limit 1',
    [email],
  );

  return rows.length > 0;
}

export async function inviteUser(email: string, name: string): Promise<void> {
  await db.execute(
    'insert into `user` (id, name, email, emailVerified, createdAt, updatedAt) values (?, ?, ?, ?, now(), now())',
    [randomUUID(), name, email, 1],
  );
}

export async function revokeUser(email: string): Promise<boolean> {
  const [result] = await db.execute('delete from `user` where email = ?', [email]);

  return (result as { affectedRows: number }).affectedRows > 0;
}
