"use server"; import { Resend } from "resend"; const resend = new Resend(process.env.RESEND_API_KEY); interface QuoteRequest { // Product doorType: string; gridType: string; doorConfig: string; sidePanel: string; // Dimensions width: number; height: number; doorLeafWidth: number; // Options finish: string; glassColor: string; handle: string; frameSize: number; glassPattern: string; // Extras extraOptions: string[]; // Contact name: string; email: string; phone: string; note: string; // Pricing totalPrice: number; steelCost: number; glassCost: number; baseFee: number; mechanismSurcharge: number; sidePanelSurcharge: number; handleCost: number; finishSurcharge: number; // Screenshot screenshotDataUrl: string | null; } const LABEL_MAP: Record = { taats: "Taatsdeur", scharnier: "Scharnierdeur", paneel: "Vast Paneel", enkele: "Enkele deur", dubbele: "Dubbele deur", geen: "Geen", links: "Links", rechts: "Rechts", beide: "Beide zijden", zwart: "Mat Zwart", brons: "Brons", grijs: "Antraciet", goud: "Goud", beige: "Beige", ral: "RAL Kleur", helder: "Helder glas", "mat-blank": "Mat Blank", "mat-brons": "Mat Brons", "mat-zwart": "Mat Zwart", beugelgreep: "Beugelgreep", hoekgreep: "Hoekgreep", maangreep: "Maangreep", ovaalgreep: "Ovaalgreep", klink: "Deurklink", "u-greep": "U-Greep", standard: "Standaard", "dt9-rounded": "DT9 Afgerond", "dt10-ushape": "DT10 U-vorm", }; function label(key: string): string { return LABEL_MAP[key] || key; } function formatPrice(cents: number): string { return new Intl.NumberFormat("nl-NL", { style: "currency", currency: "EUR", minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(cents); } function buildHtmlEmail(data: QuoteRequest): string { const rows = [ ["Deurtype", label(data.doorType)], ["Verdeling", data.gridType], ["Configuratie", label(data.doorConfig)], ["Zijpanelen", label(data.sidePanel)], ["", ""], ["Breedte (wandopening)", `${data.width} mm`], ["Hoogte", `${data.height} mm`], ["Deurblad breedte", `${Math.round(data.doorLeafWidth)} mm`], ["", ""], ["Afwerking", label(data.finish)], ["Glaskleur", label(data.glassColor)], ["Greep", label(data.handle)], ["Profielbreedte", `${data.frameSize} mm`], ["Glaspatroon", label(data.glassPattern)], ]; if (data.extraOptions.length > 0) { rows.push(["", ""], ["Extra opties", data.extraOptions.join(", ")]); } const tableRows = rows .filter(([k]) => k !== "") .map( ([k, v]) => `${k}${v}` ) .join(""); const priceRows = [ ["Staal", formatPrice(data.steelCost)], ["Glas", formatPrice(data.glassCost)], ["Basiskost", formatPrice(data.baseFee)], ...(data.mechanismSurcharge > 0 ? [["Mechanisme toeslag", formatPrice(data.mechanismSurcharge)]] : []), ...(data.sidePanelSurcharge > 0 ? [["Zijpaneel toeslag", formatPrice(data.sidePanelSurcharge)]] : []), ...(data.handleCost > 0 ? [["Greep", formatPrice(data.handleCost)]] : []), ...(data.finishSurcharge > 0 ? [["Kleur toeslag", formatPrice(data.finishSurcharge)]] : []), ]; const priceTableRows = priceRows .map( ([k, v]) => `${k}${v}` ) .join(""); return `

Nieuwe Offerte Aanvraag

Via Proinn Configurator

Contactgegevens

${data.name}

${data.email} | ${data.phone}

${data.note ? `

${data.note}

` : ""}

Configuratie

${tableRows}

Indicatieprijs

${priceTableRows}
Indicatieprijs totaal
${formatPrice(data.totalPrice)}

* Dit is een indicatieprijs. De definitieve prijs wordt bepaald na opmeting.

`; } export async function sendQuoteAction( data: QuoteRequest ): Promise<{ success: boolean; error?: string }> { try { const html = buildHtmlEmail(data); const attachments: Array<{ filename: string; content: string }> = []; if (data.screenshotDataUrl) { const base64Data = data.screenshotDataUrl.replace(/^data:image\/\w+;base64,/, ""); attachments.push({ filename: "deur-configuratie.png", content: base64Data, }); } await resend.emails.send({ from: "Proinn Configurator ", to: ["info@proinn.nl"], replyTo: data.email, subject: `Offerte Aanvraag - ${data.name} - ${label(data.doorType)}`, html, ...(attachments.length > 0 ? { attachments } : {}), }); // Send confirmation to customer await resend.emails.send({ from: "Proinn ", to: [data.email], subject: "Uw offerte aanvraag is ontvangen - Proinn", html: `

Bedankt voor uw aanvraag, ${data.name}!

Wij hebben uw configuratie ontvangen en nemen zo snel mogelijk contact met u op.

Indicatieprijs: ${formatPrice(data.totalPrice)}
Dit is een indicatieprijs. De definitieve prijs wordt bepaald na opmeting.

Proinn Stalen Deuren | proinn.nl

`, }); return { success: true }; } catch (error) { console.error("Failed to send quote email:", error); return { success: false, error: "Er is iets misgegaan bij het versturen. Probeer het opnieuw.", }; } }