import { readFile } from "node:fs/promises"; import { fileURLToPath } from "node:url"; import { dirname, resolve } from "node:path"; // Helper function to convert date from yyyy-mm-dd to dd.mm.yyyy function formatDateGerman(dateString: string): string { const [year, month, day] = dateString.split('-'); return `${day}.${month}.${year}`; } let cachedLogoDataUrl: string | null = null; async function getLogoDataUrl(): Promise { if (cachedLogoDataUrl) return cachedLogoDataUrl; try { const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const logoPath = resolve(__dirname, "../../../assets/stargilnails_logo_transparent.png"); const buf = await readFile(logoPath); const base64 = buf.toString("base64"); cachedLogoDataUrl = `data:image/png;base64,${base64}`; return cachedLogoDataUrl; } catch { return null; } } async function renderBrandedEmail(title: string, bodyHtml: string): Promise { const logo = await getLogoDataUrl(); const domain = process.env.DOMAIN || 'localhost:5173'; const protocol = domain.includes('localhost') ? 'http' : 'https'; const homepageUrl = `${protocol}://${domain}`; return `
${logo ? `Stargirlnails` : `
💅
`}

${title}

${bodyHtml}

© ${new Date().getFullYear()} Stargirlnails Kiel • Professional Nail Care
`; } export async function renderBookingPendingHTML(params: { name: string; date: string; time: string; statusUrl?: string }) { const { name, date, time, statusUrl } = params; const formattedDate = formatDateGerman(date); const domain = process.env.DOMAIN || 'localhost:5173'; const protocol = domain.includes('localhost') ? 'http' : 'https'; const legalUrl = `${protocol}://${domain}/legal`; const inner = `

Hallo ${name},

wir haben deine Anfrage für ${formattedDate} um ${time} erhalten.

Wir bestätigen deinen Termin in Kürze. Du erhältst eine weitere E-Mail, sobald der Termin bestätigt ist.

${statusUrl ? `

⏳ Termin-Status ansehen:

Du kannst den aktuellen Status deiner Buchung jederzeit einsehen:

Status ansehen
` : ''}

📋 Rechtliche Informationen:

Weitere Informationen findest du in unserem Impressum und Datenschutz.

Liebe Grüße,
Stargirlnails Kiel

`; return renderBrandedEmail("Deine Terminanfrage ist eingegangen", inner); } export async function renderBookingConfirmedHTML(params: { name: string; date: string; time: string; cancellationUrl?: string; reviewUrl?: string }) { const { name, date, time, cancellationUrl, reviewUrl } = params; const formattedDate = formatDateGerman(date); const domain = process.env.DOMAIN || 'localhost:5173'; const protocol = domain.includes('localhost') ? 'http' : 'https'; const legalUrl = `${protocol}://${domain}/legal`; const inner = `

Hallo ${name},

wir haben deinen Termin am ${formattedDate} um ${time} bestätigt.

Wir freuen uns auf dich!

📋 Wichtiger Hinweis:

Die Allgemeinen Geschäftsbedingungen (AGB) findest du im Anhang dieser E-Mail. Bitte lies sie vor deinem Termin durch.

${cancellationUrl ? `

📅 Termin verwalten:

Du kannst deinen Termin-Status einsehen und bei Bedarf stornieren:

Termin ansehen & verwalten
` : ''} ${reviewUrl ? `

⭐ Bewertung abgeben:

Nach deinem Termin würden wir uns über deine Bewertung freuen!

Bewertung schreiben

Du kannst deine Bewertung nach dem Termin über diesen Link abgeben.

` : ''}

📋 Rechtliche Informationen:

Weitere Informationen findest du in unserem Impressum und Datenschutz.

Liebe Grüße,
Stargirlnails Kiel

`; return renderBrandedEmail("Termin bestätigt", inner); } export async function renderBookingCancelledHTML(params: { name: string; date: string; time: string }) { const { name, date, time } = params; const formattedDate = formatDateGerman(date); const domain = process.env.DOMAIN || 'localhost:5173'; const protocol = domain.includes('localhost') ? 'http' : 'https'; const legalUrl = `${protocol}://${domain}/legal`; const inner = `

Hallo ${name},

dein Termin am ${formattedDate} um ${time} wurde abgesagt.

Bitte buche einen neuen Termin. Bei Fragen helfen wir dir gerne weiter.

📋 Rechtliche Informationen:

Weitere Informationen findest du in unserem Impressum und Datenschutz.

Liebe Grüße,
Stargirlnails Kiel

`; return renderBrandedEmail("Termin abgesagt", inner); } export async function renderAdminBookingNotificationHTML(params: { name: string; date: string; time: string; treatment: string; phone: string; notes?: string; hasInspirationPhoto: boolean; }) { const { name, date, time, treatment, phone, notes, hasInspirationPhoto } = params; const formattedDate = formatDateGerman(date); const inner = `

Hallo Admin,

eine neue Buchungsanfrage ist eingegangen:

📅 Buchungsdetails:

  • Name: ${name}
  • Telefon: ${phone}
  • Behandlung: ${treatment}
  • Datum: ${formattedDate}
  • Uhrzeit: ${time}
  • ${notes ? `
  • Notizen: ${notes}
  • ` : ''}
  • Inspiration-Foto: ${hasInspirationPhoto ? '✅ Im Anhang verfügbar' : '❌ Kein Foto hochgeladen'}

Bitte logge dich in das Admin-Panel ein, um die Buchung zu bestätigen oder abzulehnen.

Liebe Grüße,
Stargirlnails System

`; return renderBrandedEmail("Neue Buchungsanfrage - Admin-Benachrichtigung", inner); } export async function renderBookingRescheduleProposalHTML(params: { name: string; originalDate: string; originalTime: string; proposedDate: string; proposedTime: string; treatmentName: string; acceptUrl: string; declineUrl: string; expiresAt: string; }) { const formattedOriginalDate = formatDateGerman(params.originalDate); const formattedProposedDate = formatDateGerman(params.proposedDate); const expiryDate = new Date(params.expiresAt); const formattedExpiry = `${expiryDate.toLocaleDateString('de-DE')} ${expiryDate.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' })}`; const inner = `

Hallo ${params.name},

wir müssen deinen Termin leider verschieben. Hier ist unser Vorschlag:

📅 Übersicht

Alter Termin ${formattedOriginalDate} um ${params.originalTime} Uhr
Neuer Vorschlag ${formattedProposedDate} um ${params.proposedTime} Uhr
Behandlung ${params.treatmentName}
⏰ Bitte antworte bis ${formattedExpiry}.
Neuen Termin akzeptieren Termin ablehnen
Wenn du den Vorschlag ablehnst, bleibt dein ursprünglicher Termin bestehen und wir kontaktieren dich für eine alternative Lösung.

Falls du einen komplett neuen Termin buchen möchtest, kannst du deinen aktuellen Termin stornieren und einen neuen Termin auf unserer Website buchen.

Liebe Grüße,
Stargirlnails Kiel

`; return renderBrandedEmail("Terminänderung vorgeschlagen", inner); } export async function renderAdminRescheduleDeclinedHTML(params: { customerName: string; originalDate: string; originalTime: string; proposedDate: string; proposedTime: string; treatmentName: string; customerEmail?: string; customerPhone?: string; }) { const inner = `

Hallo Admin,

der Kunde ${params.customerName} hat den Terminänderungsvorschlag abgelehnt.

  • Kunde: ${params.customerName}
  • ${params.customerEmail ? `
  • E-Mail: ${params.customerEmail}
  • ` : ''} ${params.customerPhone ? `
  • Telefon: ${params.customerPhone}
  • ` : ''}
  • Behandlung: ${params.treatmentName}
  • Ursprünglicher Termin: ${formatDateGerman(params.originalDate)} um ${params.originalTime} Uhr (bleibt bestehen)
  • Abgelehnter Vorschlag: ${formatDateGerman(params.proposedDate)} um ${params.proposedTime} Uhr

Bitte kontaktiere den Kunden, um eine alternative Lösung zu finden.

`; return renderBrandedEmail("Kunde hat Terminänderung abgelehnt", inner); } export async function renderAdminRescheduleAcceptedHTML(params: { customerName: string; originalDate: string; originalTime: string; newDate: string; newTime: string; treatmentName: string; }) { const inner = `

Hallo Admin,

der Kunde ${params.customerName} hat den Terminänderungsvorschlag akzeptiert.

  • Kunde: ${params.customerName}
  • Behandlung: ${params.treatmentName}
  • Alter Termin: ${formatDateGerman(params.originalDate)} um ${params.originalTime} Uhr
  • Neuer Termin: ${formatDateGerman(params.newDate)} um ${params.newTime} Uhr ✅

Der Termin wurde automatisch aktualisiert.

`; return renderBrandedEmail("Kunde hat Terminänderung akzeptiert", inner); } export async function renderAdminRescheduleExpiredHTML(params: { expiredProposals: Array<{ customerName: string; originalDate: string; originalTime: string; proposedDate: string; proposedTime: string; treatmentName: string; customerEmail?: string; customerPhone?: string; expiredAt: string; }>; }) { const inner = `

Hallo Admin,

${params.expiredProposals.length} Terminänderungsvorschlag${params.expiredProposals.length > 1 ? 'e' : ''} ${params.expiredProposals.length > 1 ? 'sind' : 'ist'} abgelaufen und wurde${params.expiredProposals.length > 1 ? 'n' : ''} automatisch entfernt.

⚠️ Abgelaufene Vorschläge:

${params.expiredProposals.map(proposal => `
  • Kunde: ${proposal.customerName}
  • ${proposal.customerEmail ? `
  • E-Mail: ${proposal.customerEmail}
  • ` : ''} ${proposal.customerPhone ? `
  • Telefon: ${proposal.customerPhone}
  • ` : ''}
  • Behandlung: ${proposal.treatmentName}
  • Ursprünglicher Termin: ${formatDateGerman(proposal.originalDate)} um ${proposal.originalTime} Uhr
  • Vorgeschlagener Termin: ${formatDateGerman(proposal.proposedDate)} um ${proposal.proposedTime} Uhr
  • Abgelaufen am: ${new Date(proposal.expiredAt).toLocaleString('de-DE')}
`).join('')}

Bitte kontaktiere die Kunden, um eine alternative Lösung zu finden.

Die ursprünglichen Termine bleiben bestehen.

`; return renderBrandedEmail("Abgelaufene Terminänderungsvorschläge", inner); }