import * as XLSX from 'xlsx'; import { GoogleAdsResult, MagicWandResult } from "../types"; export const downloadFile = (filename: string, content: any, contentType: string) => { if (typeof window === 'undefined') return; const blob = content instanceof Blob ? content : new Blob([content], { type: contentType }); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.setAttribute("href", url); link.setAttribute("download", filename); document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }; export const generateGoogleAdsCSV = (googleAds?: any, magic?: any): string => { const rows: string[][] = []; if (googleAds) { rows.push(["GOOGLE ADS STRATEGY REPORT"]); rows.push(["Generated at", new Date().toLocaleString()]); rows.push(["Website", googleAds.websiteUrl || 'N/A']); rows.push([]); const kw = googleAds.keywords; if (kw) { rows.push(["KEYWORD RESEARCH"]); rows.push(["Type", "Keyword", "CPC", "Volume", "Competition"]); if (Array.isArray(kw.primary)) kw.primary.forEach((k: any) => rows.push(["Primary", String(k?.keyword || ''), String(k?.cpc || ''), String(k?.searchVolume || ''), String(k?.competition || '')])); if (Array.isArray(kw.longTail)) kw.longTail.forEach((k: any) => rows.push(["Long-tail", String(k?.keyword || ''), String(k?.cpc || ''), String(k?.searchVolume || ''), String(k?.competition || '')])); if (Array.isArray(kw.negative)) kw.negative.forEach((k: any) => rows.push(["Negative", String(k?.keyword || ''), "", "", String(k?.competition || '')])); rows.push([]); } const ads = googleAds.adCopies; if (Array.isArray(ads)) { rows.push(["AD COPIES"]); rows.push(["Variation", "Headlines", "Descriptions", "CTA", "Optimized", "Positioning"]); ads.forEach((ad: any, i: number) => { const hl = Array.isArray(ad.headlines) ? ad.headlines.join(' | ') : ''; const ds = Array.isArray(ad.descriptions) ? ad.descriptions.join(' | ') : ''; rows.push([`Var ${i + 1}`, hl, ds, String(ad?.callToAction || ''), String(ad?.mobileOptimized || 'false'), String(ad?.positioning || '')]); }); rows.push([]); } const camps = googleAds.campaigns; if (Array.isArray(camps)) { rows.push(["CAMPAIGN STRUCTURE"]); rows.push(["Name", "Type", "Budget", "Locations", "Targeting", "Bidding"]); camps.forEach((c: any) => { const t = c.targeting; const locs = (t && Array.isArray(t.locations)) ? t.locations.join('; ') : 'All'; const demos = (t && t.demographics) ? `Age: ${t.demographics.age?.join(', ') || 'Any'}; Gender: ${t.demographics.gender?.join(', ') || 'Any'}` : 'All'; rows.push([String(c.name || ''), String(c.type || ''), `${c?.budget?.daily || 0} ${c?.budget?.currency || ''}`, locs, demos, String(c.biddingStrategy || '')]); }); rows.push([]); } } if (magic) { rows.push(["MARKET INTELLIGENCE"]); const ma = magic.marketAnalysis; if (ma) { rows.push(["Size", String(ma.industrySize || '')]); rows.push(["Growth", String(ma.growthRate || '')]); rows.push(["Trends", Array.isArray(ma.marketTrends) ? ma.marketTrends.join('; ') : '']); rows.push(["Competitors", Array.isArray(ma.topCompetitors) ? ma.topCompetitors.join('; ') : '']); rows.push([]); } const strats = magic.strategies; if (Array.isArray(strats)) { rows.push(["STRATEGIES"]); strats.forEach((s: any) => { rows.push(["Direction", String(s.direction || '')]); rows.push(["Target", String(s.targetAudience || '')]); rows.push(["ROI", String(s.expectedROI || '')]); rows.push(["Risk", String(s.riskLevel || '')]); rows.push(["Timeframe", String(s.timeToResults || '')]); rows.push([]); }); } } return rows.map(r => r.map(c => `"${String(c || '').replace(/"/g, '""')}"`).join(",")).join("\n"); }; export const generateGoogleAdsExcel = (googleAds?: any, magic?: any): Blob => { const wb = XLSX.utils.book_new(); // 1. Overview Sheet const overviewData: any[] = [ ["Attribute", "Value"], ["Report Title", "Google Ads Strategy Report"], ["Generated At", new Date().toLocaleString()], ["Website URL", googleAds?.websiteUrl || magic?.websiteUrl || 'N/A'], [], ["Performance Forecasts"], ["Est. Impressions", googleAds?.predictions?.estimatedImpressions || 'N/A'], ["Est. Clicks", googleAds?.predictions?.estimatedClicks || 'N/A'], ["Est. CTR", googleAds?.predictions?.estimatedCtr || 'N/A'], ["Est. Conversions", googleAds?.predictions?.estimatedConversions || 'N/A'], ["Est. Conversion Rate", googleAds?.predictions?.conversionRate || 'N/A'], ["Avg. CPC", googleAds?.predictions?.avgCpc || 'N/A'], [], ["Historical Benchmarks"], ["Avg. Industry CTR", googleAds?.historicalBenchmarks?.industryAverageCtr || 'N/A'], ["Avg. Industry CPC", googleAds?.historicalBenchmarks?.industryAverageCpc || 'N/A'], ["Seasonal Trends", googleAds?.historicalBenchmarks?.seasonalTrends || 'N/A'], ["Geographic Insights", googleAds?.historicalBenchmarks?.geographicInsights || 'N/A'] ]; const overviewSheet = XLSX.utils.aoa_to_sheet(overviewData); XLSX.utils.book_append_sheet(wb, overviewSheet, "Overview"); // 2. Keywords Sheet if (googleAds?.keywords) { const kw = googleAds.keywords; const kwData: any[] = [ ["Type", "Keyword", "Avg. CPC", "Monthly Volume", "Competition", "Difficulty"] ]; if (Array.isArray(kw.primary)) kw.primary.forEach((k: any) => kwData.push(["Primary", k.keyword, k.cpc, k.searchVolume, k.competition, k.difficultyScore])); if (Array.isArray(kw.longTail)) kw.longTail.forEach((k: any) => kwData.push(["Long-tail", k.keyword, k.cpc, k.searchVolume, k.competition, k.difficultyScore])); if (Array.isArray(kw.negative)) kw.negative.forEach((k: any) => kwData.push(["Negative", k.keyword, "", "", k.competition, ""])); const kwSheet = XLSX.utils.aoa_to_sheet(kwData); XLSX.utils.book_append_sheet(wb, kwSheet, "Keywords"); } // 3. Ad Copies Sheet if (Array.isArray(googleAds?.adCopies)) { const adData: any[] = [ ["ID", "Variation", "Headlines", "Descriptions", "CTA", "Mobile Optimized", "Strategic Positioning"] ]; googleAds.adCopies.forEach((ad: any, i: number) => { adData.push([ ad.id, `Variation ${i + 1}`, (ad.headlines || []).join(" | "), (ad.descriptions || []).join(" | "), ad.callToAction, ad.mobileOptimized ? "Yes" : "No", ad.positioning || "N/A" ]); }); const adSheet = XLSX.utils.aoa_to_sheet(adData); XLSX.utils.book_append_sheet(wb, adSheet, "Ad Copies"); } // 4. Competitors Sheet if (magic?.competitorInsights || magic?.marketAnalysis) { const compData: any[] = [ ["Competitor", "Website", "Est. Monthly Spend", "Target Audience", "Strengths", "Weaknesses", "Ad Strategy", "Top Keywords"] ]; if (Array.isArray(magic.competitorInsights)) { magic.competitorInsights.forEach((c: any) => { compData.push([ c.competitor, c.website || 'N/A', c.estimatedSpend || 'N/A', c.targetAudience || 'N/A', (c.strengths || []).join(", "), (c.weaknesses || []).join(", "), c.adStrategy, (c.topKeywords || []).join(", ") ]); }); } const compSheet = XLSX.utils.aoa_to_sheet(compData); XLSX.utils.book_append_sheet(wb, compSheet, "Competitor Analysis"); } // 5. Strategies Sheet if (Array.isArray(magic?.strategies)) { const stratData: any[] = [ ["ID", "Strategic Direction", "Rationale", "Target Audience", "Competitive Advantage", "Expected ROI", "Risk Level", "Time to Results", "Success Metrics"] ]; magic.strategies.forEach((s: any) => { stratData.push([ s.id, s.direction, s.rationale, s.targetAudience, s.competitiveAdvantage, s.expectedROI, s.riskLevel, s.timeToResults, (s.successMetrics || []).join(", ") ]); }); const stratSheet = XLSX.utils.aoa_to_sheet(stratData); XLSX.utils.book_append_sheet(wb, stratSheet, "Strategies"); } const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); return new Blob([wbout], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); }; export const generateGoogleAdsHTML = (googleAds?: any, magic?: any): string => { const data = JSON.stringify({ googleAds, magic }, null, 2); return `
360° Campaign Architecture for ${googleAds?.websiteUrl || 'New Project'}
Generated On
${new Date().toLocaleDateString()}
Est. Monthly Impressions
${googleAds?.predictions?.estimatedImpressions || '15k-25k'}
Target CTR
${googleAds?.predictions?.estimatedCtr || '3.5%'}
Est. Conversions
${googleAds?.predictions?.estimatedConversions || '30-50'}
Industry Avg CTR
${googleAds?.historicalBenchmarks?.industryAverageCtr || '3.1%'}
Market Sentiment
${c.website || 'Direct Competitor'}
Est. Spend
${c.estimatedSpend || 'Undisclosed'}
Core Strengths
Weaknesses
Counter-Strategy Rationale
"${c.adStrategy}"
Expected ROI
${s.expectedROI}
Time to Impact
${s.timeToResults}
Strategic Rationale
${s.rationale}
Target Audience
${s.targetAudience}
Competitive Edge
${s.competitiveAdvantage}
Channel Matrix
Success Thresholds