import { NewsletterCampaign, ProductItem } from '@/types/newsletter'; import { SUPABASE_ASSETS_BASE } from './defaultCampaign'; import { renderCleanBadgeSvg } from './badgeUtils'; import { pickAlt } from './altText'; export function renderEmailHtml(campaign: NewsletterCampaign): string { const renderedModules = campaign.modules.map((m) => renderModule(m, campaign)).join('\n'); return ` ${escapeHtml(campaign.title)}
${escapeHtml(campaign.preheader || '')}
͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌ ͏ ‌
`; } export function renderSingleModuleHtml(m: any, campaign: NewsletterCampaign): string { return renderModule(m, campaign); } function renderModule(m: any, campaign: NewsletterCampaign): string { switch (m.type) { case 'announcement': if (m.data?.enabled === false) { return ''; } return `
`; case 'header': const rawNav = m.data.navLinks && m.data.navLinks.length > 0 ? m.data.navLinks : [ { label: 'Letáky', url: 'https://www.coop.sk/sk/letaky', variant: 'outline' }, { label: 'COOP Klub', url: 'https://www.coopklub.sk', variant: 'filled' } ]; const navLinks = rawNav.map((link: any) => { if (link.variant === 'filled') { return `${escapeHtml(link.label || 'Odkaz')}`; } return `${escapeHtml(link.label || 'Odkaz')}`; }).join('\n'); return `
 
`; case 'banner': return ` ${m.data.title || m.data.description || m.data.buttonText ? ` ` : ''}
 
`; case 'products_grid': const globalValidity = m.data.globalValidity || ''; const products: ProductItem[] = m.data.products || []; const cardBg = m.data.cardBgColor || '#feeaea'; const cardBorder = m.data.cardBorderColor || '#f5d4d4'; const badgeHdrBg = m.data.badgeHeaderBg || '#fefefe'; const badgeHdrColor = m.data.badgeHeaderColor || '#000000'; const badgePrcBg = m.data.badgePriceBg || '#e2001a'; const badgePrcColor = m.data.badgePriceColor || '#fefefe'; const badgeCustomTxt = m.data.badgeHeaderCustomText || null; const cols = m.data.columns === 1 ? 1 : 2; const rows: ProductItem[][] = []; for (let i = 0; i < products.length; i += cols) { rows.push(products.slice(i, i + cols)); } const rowsHtml = rows.map((row) => { if (cols === 1) { const p = row[0]; return `
${renderExactProductCard(p, globalValidity, cardBg, cardBorder, badgeHdrBg, badgeHdrColor, badgePrcBg, badgePrcColor, badgeCustomTxt, m.data.sectionTitle)}
`; } return ` ${row.map((p, idx) => ` `).join('\n')} ${row.length === 1 ? '' : ''}
${renderExactProductCard(p, globalValidity, cardBg, cardBorder, badgeHdrBg, badgeHdrColor, badgePrcBg, badgePrcColor, badgeCustomTxt, m.data.sectionTitle)}
`; }).join('\n'); return ` ${m.data.sectionTitle ? ` ` : ''}

${escapeHtml(m.data.sectionTitle)}

${rowsHtml}
`; case 'loyalty_club': if (m.data.enabled === false) { return ''; } const lProducts = m.data.products || []; return `

${escapeHtml(m.data.sectionTitle || 'Vernostné zľavy')}

${lProducts.map((p: any, idx: number) => ` `).join('\n')}
${renderExactLoyaltyCard(p, m.data.globalValidity || '2. 5. – 15. 5. 2026')}
 
`; case 'articles_row': const it1 = m.data.item1; const it2 = m.data.item2; // Ak ide o letáky if (it1?.btnText) { return `
${escapeHtml(pickAlt(it1.altText, it1.title, m.data.title, m.title, 'Aktuálny leták'))}

${escapeHtml(it1.title)}

${escapeHtml(pickAlt(it2.altText, it2.title, m.data.title, m.title, 'Aktuálny leták'))}

${escapeHtml(it2.title)}

 
`; } // Inak články / recepty return `
${escapeHtml(pickAlt(it1.altText, it1.title, 'Recepty'))}

${escapeHtml(it1.title)}

${escapeHtml(pickAlt(it2.altText, it2.title, 'Časopis Jednota'))}

${escapeHtml(it2.title)}

 
`; case 'footer': return ` `; default: return ''; } } function renderExactProductCard( p: ProductItem, globalValidity: string, cardBg: string, cardBorder: string, badgeHdrBg: string, badgeHdrColor: string, badgePrcBg: string, badgePrcColor: string, badgeCustomTxt: string | null, sectionTitle?: string ): string { const validity = p.validityOverride || globalValidity; const effectiveCardBg = p.cardBgColor || cardBg || '#feeaea'; const storesHtml = ` ${p.stores?.potraviny ? `` : ''} ${p.stores?.supermarket ? `` : ''} ${p.stores?.tempo ? `` : ''}
Potraviny
Supermarket
Tempo
`; const badgeLayout = p.badgeLayout || 'below'; // Pomocná funkcia na render samotnej cenovky (bez obalového ) const renderBadgeContent = (bWidth: number, bAlign: string, padTop: number, padBottom: number, marginStyle: string) => { // Vlastná PNG cenovka (výnimka) má prednosť pred šablónou; po jej odstránení sa vráti šablóna if (p.customBadgePngUrl) { return `
${escapeHtml(pickAlt(p.title, 'Cenovka'))}
`; } if (p.badgeCustomTemplate) { return `
${renderCleanBadgeSvg(p.badgeCustomTemplate, p, bWidth)}
`; } const mainFontSize = Math.max(28, Math.round(bWidth * 0.54)); const subFontSize = Math.max(14, Math.round(bWidth * 0.27)); return `
${badgeCustomTxt ? ` ` : (p.discountText ? ` ` : '')}
${escapeHtml(badgeCustomTxt)}
${escapeHtml(p.badgeText || 'zľava')} ${escapeHtml(p.discountText)}
${escapeHtml(p.priceMain)}${escapeHtml(p.priceSub)}
`; }; if (badgeLayout === 'side') { // Rozloženie: obrázok vľavo | cenovka vpravo const bWidth = p.badgeWidth || (p.badgeCustomTemplate ? (p.badgeCustomTemplate.width || 110) : 95); const bAlign = 'center'; const padTop = p.badgePaddingTop ?? (p.badgeCustomTemplate?.paddingTop ?? 0); const padBottom = p.badgePaddingBottom ?? (p.badgeCustomTemplate?.paddingBottom ?? 0); const marginStyle = 'margin: 0 auto;'; return ` `; } // Predvolené rozloženie: cenovka pod obrázkom return ` `; } function renderExactLoyaltyCard(p: any, validity: string): string { const cardValidity = p.validityOverride || validity; const storesHtml = ` ${p.stores?.potraviny ? `` : ''} ${p.stores?.supermarket ? `` : ''} ${p.stores?.tempo ? `` : ''}
Potraviny
Supermarket
Tempo
`; const loyaltyBg = p.cardBgColor || '#e6e1d9'; return ` ${p.badgeCustomTemplate || p.customBadgePngUrl ? ` ` : ''} `; } function escapeHtml(str: string): string { if (!str) return ''; return String(str) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }