import { desc, eq } from "drizzle-orm";
import { getDb } from "./db";
import { historiqueAttestations, sequences, apprenants, formations } from "../drizzle/schema";

/**
 * Enregistrer un envoi d'attestation dans l'historique
 */
export async function enregistrerEnvoiAttestation(data: {
  sequenceId: number;
  apprenantId: number;
  statut: "envoye" | "erreur";
  messageErreur?: string;
  urlAttestation?: string;
}) {
  const db = await getDb();
  if (!db) throw new Error("Database not available");

  await db.insert(historiqueAttestations).values({
    sequenceId: data.sequenceId,
    apprenantId: data.apprenantId,
    statut: data.statut,
    messageErreur: data.messageErreur || null,
    urlAttestation: data.urlAttestation || null,
  });
}

/**
 * Récupérer l'historique des envois d'attestations
 * Avec les informations de la séquence, formation et apprenant
 */
export async function getHistoriqueAttestations() {
  const db = await getDb();
  if (!db) return [];

  const results = await db
    .select({
      id: historiqueAttestations.id,
      dateEnvoi: historiqueAttestations.dateEnvoi,
      statut: historiqueAttestations.statut,
      messageErreur: historiqueAttestations.messageErreur,
      urlAttestation: historiqueAttestations.urlAttestation,
      sequence: {
        id: sequences.id,
        nom: sequences.nom,
      },
      formation: {
        id: formations.id,
        nom: formations.nom,
      },
      apprenant: {
        id: apprenants.id,
        nom: apprenants.nom,
        prenom: apprenants.prenom,
        email: apprenants.email,
      },
    })
    .from(historiqueAttestations)
    .innerJoin(sequences, eq(historiqueAttestations.sequenceId, sequences.id))
    .innerJoin(formations, eq(sequences.formationId, formations.id))
    .innerJoin(apprenants, eq(historiqueAttestations.apprenantId, apprenants.id))
    .orderBy(desc(historiqueAttestations.dateEnvoi));

  return results;
}

/**
 * Récupérer l'historique des attestations pour une séquence spécifique
 */
export async function getHistoriqueAttestationsBySequence(sequenceId: number) {
  const db = await getDb();
  if (!db) return [];

  const results = await db
    .select({
      id: historiqueAttestations.id,
      dateEnvoi: historiqueAttestations.dateEnvoi,
      statut: historiqueAttestations.statut,
      messageErreur: historiqueAttestations.messageErreur,
      urlAttestation: historiqueAttestations.urlAttestation,
      apprenant: {
        id: apprenants.id,
        nom: apprenants.nom,
        prenom: apprenants.prenom,
        email: apprenants.email,
      },
    })
    .from(historiqueAttestations)
    .innerJoin(apprenants, eq(historiqueAttestations.apprenantId, apprenants.id))
    .where(eq(historiqueAttestations.sequenceId, sequenceId))
    .orderBy(desc(historiqueAttestations.dateEnvoi));

  return results;
}
