function formatDateFr(date: Date | string | null | undefined) { if (!date) return "Non renseignée"; return new Date(date).toLocaleDateString("fr-FR", { day: "2-digit", month: "long", year: "numeric", }); } function escapeHtml(value: string) { return value .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } export function generateMaterialReturnReminderEmail(input: { associationName: string; serviceLabel?: string | null; restitutionDate: Date | string; uploadLink: string; requestTitle: string; tone?: "assignment" | "scheduled" | "overdue" | "reactivation"; }) { const restitutionLabel = formatDateFr(input.restitutionDate); const serviceLabel = input.serviceLabel?.trim() || "service technique / logistique"; const tone = input.tone || "scheduled"; const toneContent = { assignment: { subject: `Mission de récupération assignée - ${input.associationName} - restitution prévue le ${restitutionLabel}`, title: "Mission de récupération assignée", intro: `Une mission de récupération du matériel a été attribuée à ${escapeHtml(serviceLabel)} pour ${escapeHtml(input.associationName)}.`, actionTitle: "Action à préparer", actionBody: "La fiche d'état des lieux préremplie CCDS est jointe à cet email. Conservez ce lien terrain : il vous permettra de constater la restitution, signer sur smartphone et clôturer le dossier le moment venu.", accent: "#0f2d63", alertBg: "#f5f9ff", alertBorder: "#cfe0ff", alertTitleColor: "#0f2d63", }, scheduled: { subject: `Récupération matériel à organiser - ${input.associationName} - restitution prévue le ${restitutionLabel}`, title: "Récupération du matériel à organiser", intro: `La restitution du matériel pour ${escapeHtml(input.associationName)} approche.`, actionTitle: "Action attendue", actionBody: "La fiche d'état des lieux préremplie CCDS est jointe à cet email. Votre service dispose d'un délai maximal de 3 jours pour effectuer la récupération, compléter la fiche contradictoire puis la déposer sur le portail.", accent: "#0f2d63", alertBg: "#fff8e6", alertBorder: "#efb100", alertTitleColor: "#7c5a00", }, overdue: { subject: `Retard de restitution - action requise - ${input.associationName} - ${restitutionLabel}`, title: "Alerte retard de restitution", intro: `La restitution du matériel pour ${escapeHtml(input.associationName)} n'a pas encore été validée dans les délais.`, actionTitle: "Relance automatique", actionBody: "Merci d'intervenir en priorité. Le délai de 3 jours après la date de restitution est dépassé. Utilisez le lien ci-dessous pour finaliser le constat terrain et débloquer la clôture du dossier.", accent: "#b45309", alertBg: "#fff7ed", alertBorder: "#fdba74", alertTitleColor: "#9a3412", }, reactivation: { subject: `Nouveau lien de restitution actif - ${input.associationName} - ${restitutionLabel}`, title: "Lien de restitution réactivé", intro: `Un nouveau lien terrain actif a été généré pour ${escapeHtml(input.associationName)}.`, actionTitle: "Action immédiate", actionBody: "Utilisez exclusivement le nouveau lien ci-dessous pour constater la restitution, signer sur smartphone et clôturer le dossier. Les anciens liens de restitution ne sont plus valides.", accent: "#0f2d63", alertBg: "#eef6ff", alertBorder: "#93c5fd", alertTitleColor: "#1d4ed8", }, }[tone]; const subject = toneContent.subject; const text = [ tone === "assignment" ? "Assignation logistique - récupération du matériel événementiel" : tone === "overdue" ? "Alerte automatique - restitution du matériel en retard" : "Rappel automatique - récupération du matériel événementiel", "", `Association : ${input.associationName}`, `Demande : ${input.requestTitle}`, `Service concerné : ${serviceLabel}`, `Date de restitution prévue : ${restitutionLabel}`, "", "La fiche d'état des lieux préremplie CCDS est jointe à cet email.", tone === "assignment" ? "Ce lien terrain devra être utilisé par l'agent mandaté pour effectuer le constat contradictoire, signer et clôturer la restitution." : tone === "reactivation" ? "Un nouveau lien actif vient d'être généré. Les anciens liens de restitution ne sont plus valides." : tone === "overdue" ? "Le délai de 3 jours après la restitution est dépassé. Merci de finaliser la récupération et de valider immédiatement la fiche sur le portail." : "Vous disposez d'un délai maximal de 3 jours pour effectuer la récupération, compléter la fiche de manière contradictoire puis la téléverser sur le portail.", "", `Téléverser la fiche signée : ${input.uploadLink}`, "", "Ce message a été généré automatiquement par le Portail Associations.", ].join("\n"); const html = `