// src/lib/tours/progress.ts — lecture/écriture de la progression du tutoriel.
// Volontairement HORS "use server" (chaque export "use server" = endpoint POST
// atteignable) : les RSC importent la lecture directement, les écritures
// publiques passent par ./actions.ts, qui dérive l'utilisateur de la session.
import "server-only";

import { eq } from "drizzle-orm";
import { db } from "@/lib/db/client";
import { tourProgress } from "@/lib/db/domain-schema";

export type TourStatus = "completed" | "dismissed";

/** Progression de CE user, tous tours confondus — l'org n'entre pas en jeu :
 *  un tour explique l'interface, pas les données d'une organisation. */
export async function getTourProgress(
  userId: string,
): Promise<Record<string, TourStatus>> {
  const rows = await db
    .select({ tourId: tourProgress.tourId, status: tourProgress.status })
    .from(tourProgress)
    .where(eq(tourProgress.userId, userId));

  return Object.fromEntries(rows.map((r) => [r.tourId, r.status]));
}

/** Idempotent : (userId, tourId) est la PK, un second passage écrase le statut
 *  au lieu d'échouer ou d'empiler une ligne. */
export async function setTourProgress(
  userId: string,
  tourId: string,
  status: TourStatus,
): Promise<void> {
  await db
    .insert(tourProgress)
    .values({ userId, tourId, status })
    .onConflictDoUpdate({
      target: [tourProgress.userId, tourProgress.tourId],
      set: { status, updatedAt: new Date() },
    });
}
