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° Google Ads Strategy Intelligence Report

Strategy Intelligence

360° Campaign Architecture for ${googleAds?.websiteUrl || 'New Project'}

Generated On

${new Date().toLocaleDateString()}

PA

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%'}

Performance Forecast

Device Distribution

Mobile
${googleAds?.campaigns?.[0]?.targeting?.devices?.mobile || '60%'}
Desktop
${googleAds?.campaigns?.[0]?.targeting?.devices?.desktop || '30%'}
Tablet
${googleAds?.campaigns?.[0]?.targeting?.devices?.tablet || '10%'}

Keyword Intelligence

Semantic Mapping Enabled

Primary Keywords

${(googleAds?.keywords?.primary || []).slice(0, 10).map((k: any) => `
${k.keyword} ${k.cpc || '$1.50'}
`).join('')}

Long-Tail Intent

${(googleAds?.keywords?.longTail || []).slice(0, 10).map((k: any) => `
${k.keyword} ${k.competition || 'low'}
`).join('')}

Exclusion List

${(googleAds?.keywords?.negative || []).slice(0, 8).map((k: any) => `
${k.keyword} EXCLUDE
`).join('')}

High-Performance Ad Copy Suite

${(googleAds?.adCopies || []).map((ad: any, i: number) => `
Variation ${i + 1} ${(ad.campaignType || 'Search').toUpperCase()}
${(ad.headlines || []).map((h: any) => `
${h}
`).join('')}
${(ad.descriptions || []).map((d: any) => `
${d}
`).join('')}
${ad.callToAction}
`).join('')}
${magic?.competitorInsights ? `

Competitive Intelligence Matrix

Market Sentiment

${(magic.competitorInsights || []).map((c: any) => `

${c.competitor}

${c.website || 'Direct Competitor'}

Est. Spend

${c.estimatedSpend || 'Undisclosed'}

Core Strengths

    ${(c.strengths || []).map((s: any) => `
  • ${s}
  • `).join('')}

Weaknesses

    ${(c.weaknesses || []).map((w: any) => `
  • ${w}
  • `).join('')}

Counter-Strategy Rationale

"${c.adStrategy}"

`).join('')}
` : ''} ${magic?.strategies ? `

Strategic Directions

${(magic.strategies || []).map((s: any, idx: number) => `
${idx + 1}

${s.direction}

${s.riskLevel || 'low'} risk profile

Expected ROI

${s.expectedROI}

Time to Impact

${s.timeToResults}

Strategic Rationale

${s.rationale}

Target Audience

${s.targetAudience}

Competitive Edge

${s.competitiveAdvantage}

Channel Matrix

${Object.entries(s.estimatedBudgetAllocation || {}).map(([c, v]: [string, any]) => `
${c} ${v}%
`).join('')}

Success Thresholds

${(s.successMetrics || []).map((m: any) => ` ${m} `).join('')}
`).join('')}
` : ''}
`; };