/**
 * Jetable. Le cycle complet sur une vraie personne, puis remise en état :
 * ouvrir un accès, s'en servir, régénérer le mot de passe, vérifier que
 * l'ancien ne marche plus, archiver, vérifier le refus, restaurer.
 */
import { eq } from "drizzle-orm"

import { account, user } from "@/lib/db/auth-schema"
import { db } from "@/lib/db/client"
import { people } from "@/lib/db/schema"
import {
  listPeople,
  openLogin,
  resetPassword,
  setArchived,
} from "@/lib/services/people"
import { signInByUsername } from "@/lib/services/sign-in"

const say = (label: string, value: unknown) => console.log(label, value)

const candidate = (await listPeople()).find(
  (p) => !p.hasLogin && !p.archived && p.username === null,
)
if (!candidate) throw new Error("personne sans accès introuvable")
say("cobaye :", `${candidate.employeeCode} ${candidate.name}`)

const NAME = "probe.temp"

// 1. Ouvrir un accès.
const opened = await openLogin(candidate.id, NAME)
say("ouverture :", opened)
if (!opened.ok) throw new Error("ouverture refusée")
const first = opened.password

// 2. Le mot de passe rendu marche vraiment.
say("connexion avec le premier :", await signInByUsername(NAME, first))

// 3. Deux fois le même accès est refusé, pas dupliqué.
say("deuxième ouverture :", await openLogin(candidate.id, "autre.nom"))

// 4. Régénérer.
const reset = await resetPassword(candidate.id)
say("régénération :", reset.ok ? "ok" : reset)
if (!reset.ok) throw new Error("régénération refusée")

say("ancien mot de passe :", await signInByUsername(NAME, first))
say("nouveau mot de passe :", await signInByUsername(NAME, reset.password))

// 5. Archiver, et vérifier que le refus vient bien de là.
say("archivage :", await setArchived(candidate.id, true))
say("connexion après archivage :", await signInByUsername(NAME, reset.password))

// 6. Restaurer.
say("restauration :", await setArchived(candidate.id, false))
say("connexion après restauration :", await signInByUsername(NAME, reset.password))

// Remise en état : la personne redevient ce qu'elle était.
const [row] = await db
  .select({ authUserId: people.authUserId })
  .from(people)
  .where(eq(people.id, candidate.id))
if (row?.authUserId) {
  await db.delete(account).where(eq(account.userId, row.authUserId))
  await db.delete(user).where(eq(user.id, row.authUserId))
}
await db
  .update(people)
  .set({ authUserId: null, username: null, archivedAt: null })
  .where(eq(people.id, candidate.id))

const [back] = await listPeople().then((all) =>
  all.filter((p) => p.id === candidate.id),
)
say("remise en état :", back)

process.exit(0)
