"use client";

import { getCalApi } from "@calcom/embed-react";

/**
 * Chargement PARESSEUX de l'embed Cal.com.
 *
 * Avant : chaque <CalButton> appelait getCalApi() dans un useEffect au montage.
 * Résultat, `app.cal.com/embed/embed.js` était injecté au chargement de chaque
 * page portant un bouton — la home en compte trois — et déposait trois cookies
 * tiers (__Secure-next-auth.csrf-token, __Secure-next-auth.callback-url,
 * __cf_bm) avant la moindre interaction. Lighthouse le remontait en
 * `third-party-cookies` + `inspector-issues` ; c'est aussi un sujet RGPD, un
 * tiers ne devrait pas déposer de cookie tant que l'utilisateur n'a pas
 * manifesté l'intention de réserver.
 *
 * Désormais le script n'est chargé qu'au clic, et la modale est ouverte par
 * programme via l'action `modal` de l'API — les attributs `data-cal-*` ne
 * peuvent plus servir, puisqu'ils supposent un script déjà présent pour les
 * scanner et s'y lier.
 *
 * La promesse est mémorisée au niveau du module : les trois boutons de la home
 * partagent le même chargement, et un second clic n'en déclenche pas un autre.
 */

const CAL_NAMESPACE = "15min";
const CAL_LINK = "aciebenegie-cal/15min";
const CAL_CONFIG = { layout: "month_view" } as const;

type CalApi = Awaited<ReturnType<typeof getCalApi>>;

let calApiPromise: Promise<CalApi> | null = null;

function loadCalApi(): Promise<CalApi> {
  calApiPromise ??= getCalApi({ namespace: CAL_NAMESPACE }).then((cal) => {
    cal("ui", {
      cssVarsPerTheme: {
        light: { "cal-brand": "var(--acieb-orange, #ea580c)" },
        dark: { "cal-brand": "var(--acieb-orange, #ea580c)" },
      },
      hideEventTypeDetails: false,
      layout: "month_view",
    });
    return cal;
  });
  return calApiPromise;
}

/**
 * Charge l'embed si nécessaire, puis ouvre la modale de réservation.
 *
 * En cas d'échec on remet la promesse à zéro : un clic suivant retentera au
 * lieu de rester bloqué sur une promesse rejetée mémorisée.
 *
 * NB : aucun pré-chargement au survol n'est câblé volontairement. Ce serait
 * possible (`loadCalApi()` sur onPointerEnter) et rendrait le premier clic
 * instantané, mais le script déposerait alors ses cookies tiers sur un simple
 * survol — un signal d'intention trop faible pour le justifier.
 */
export async function openCalModal(): Promise<void> {
  try {
    const cal = await loadCalApi();
    cal("modal", { calLink: CAL_LINK, config: CAL_CONFIG });
  } catch (error) {
    calApiPromise = null;
    throw error;
  }
}
