import { EmailTemplate } from '../types'; // Fallback for crypto.randomUUID in non-secure (HTTP) contexts export const generateUUID = () => { if (typeof crypto !== 'undefined' && crypto.randomUUID) { try { return crypto.randomUUID(); } catch (e) { // Fallback if it exists but fails } } return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }; export const generateTemplateKey = (name: string): string => { return name.trim().toLowerCase().replace(/\s+/g, '_').replace(/[^a-z0-9_]/g, ''); }; export const generateSQL = (template: EmailTemplate): string => { const fullHtml = `${template.header}${template.body}${template.footer}`.replace(/'/g, "''"); const header = template.header.replace(/'/g, "''"); const body = template.body.replace(/'/g, "''"); const footer = template.footer.replace(/'/g, "''"); const subject = template.subject.replace(/'/g, "''"); const vars = JSON.stringify(template.variables).replace(/'/g, "''"); const key = generateTemplateKey(template.name); const name = template.name.replace(/'/g, "''"); const desc = (template.description || '').replace(/'/g, "''"); return `INSERT INTO email_templates (id, template_key, name, description, subject, header_html, body_html, footer_html, full_html, required_variables) VALUES ('${template.id}', '${key}', '${name}', '${desc}', '${subject}', '${header}', '${body}', '${footer}', '${fullHtml}', '${vars}') ON DUPLICATE KEY UPDATE template_key = VALUES(template_key), name = VALUES(name), description = VALUES(description), subject = VALUES(subject), header_html = VALUES(header_html), body_html = VALUES(body_html), footer_html = VALUES(footer_html), full_html = VALUES(full_html), required_variables = VALUES(required_variables);`; }; export const generateSelectSQL = (template: EmailTemplate): string => { const key = generateTemplateKey(template.name); return `SELECT * FROM email_templates WHERE template_key = '${key}';`; }; export const generateN8nCode = (template: EmailTemplate): string => { const varsMap = template.variables.map(v => ` "${v}": "REPLACE_WITH_VALUE"`).join(',\n'); const hasVars = template.variables.length > 0; return `// Nodo Code n8n - Popolatore Template for (const item of items) { const templateHtml = item.json.full_html; const templateSubject = item.json.subject; const replacements = { ${hasVars ? varsMap : ' // Nessuna variabile rilevata'} }; let finalHtml = templateHtml; let finalSubject = templateSubject; for (const [key, value] of Object.entries(replacements)) { const regex = new RegExp('{{' + key + '}}', 'g'); finalHtml = finalHtml.replace(regex, value); if (finalSubject) { finalSubject = finalSubject.replace(regex, value); } } item.json.processed_html = finalHtml; item.json.processed_subject = finalSubject; } return items;`; }; export const getTemplates = async (): Promise => { console.log("Fetching templates from /api/templates..."); const response = await fetch('/api/templates'); if (!response.ok) { const errorBody = await response.text(); throw new Error(`Errore API (${response.status}): ${errorBody || response.statusText}`); } return await response.json(); }; export const saveTemplate = async (template: EmailTemplate): Promise => { console.log("Saving template to /api/templates...", template.name); const response = await fetch('/api/templates', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(template), }); if (!response.ok) { let errorMessage = `Errore HTTP ${response.status}`; try { const errorData = await response.json(); errorMessage = errorData.details || errorData.error || errorMessage; } catch (e) { const textError = await response.text(); if (textError) errorMessage = textError; } throw new Error(errorMessage); } }; export const deleteTemplate = async (id: string): Promise => { const response = await fetch(`/api/templates/${id}`, { method: 'DELETE', }); if (!response.ok) throw new Error('Eliminazione fallita'); };