import { eq, ne, and } from "drizzle-orm";
import { inscriptions, apprenants, sequences, datesFormation } from "../drizzle/schema";
import { getDb } from "./db";

/**
 * Récupérer les inscriptions d'une séquence avec les dates de formation
 */
export async function getInscriptionsWithDates(sequenceId: number) {
  const db = await getDb();
  if (!db) return [];

  // Récupérer les inscriptions
  const results = await db
    .select({
      inscription: inscriptions,
      apprenant: apprenants,
    })
    .from(inscriptions)
    .leftJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id))
    .where(
      and(
        eq(inscriptions.sequenceId, sequenceId),
        ne(inscriptions.statut, "annulee")
      )
    );

  // Récupérer les dates de formation pour cette séquence
  const dates = await db
    .select()
    .from(datesFormation)
    .where(eq(datesFormation.sequenceId, sequenceId))
    .orderBy(datesFormation.ordre);

  // Combiner les données
  return results.map((r) => ({
    ...r,
    dates,
  }));
}

/**
 * Récupérer les inscriptions d'un apprenant avec les détails des séquences et dates
 */
export async function getInscriptionsByApprenantWithDates(apprenantId: number) {
  const db = await getDb();
  if (!db) return [];

  // Récupérer les inscriptions
  const results = await db
    .select({
      inscription: inscriptions,
      sequence: sequences,
    })
    .from(inscriptions)
    .leftJoin(sequences, eq(inscriptions.sequenceId, sequences.id))
    .where(
      and(
        eq(inscriptions.apprenantId, apprenantId),
        ne(inscriptions.statut, "annulee")
      )
    );

  // Pour chaque inscription, récupérer les dates de formation
  const resultsWithDates = await Promise.all(
    results.map(async (r) => {
      if (!r.sequence) return { ...r, dates: [] };
      
      const dates = await db
        .select()
        .from(datesFormation)
        .where(eq(datesFormation.sequenceId, r.sequence.id))
        .orderBy(datesFormation.ordre);

      return {
        ...r,
        sequence: {
          ...r.sequence,
          dates,
        },
      };
    })
  );

  return resultsWithDates;
}
