import React, { useMemo } from 'react'; import { LeadStatus, AnalysisResult, Language, Tier, SearchStrategy } from '../types'; import { ExternalLink, AlertCircle, CheckCircle, XCircle, RefreshCcw, ArrowLeft, Clock, Euro, Download, FileText, ShoppingBag, Star, TrendingUp, Users, Database, Send, Server, Truck, Eye, Search } from 'lucide-react'; interface StepReportProps { results: AnalysisResult[]; strategy: SearchStrategy; onRestart: () => void; onBack: () => void; onStartOutreach: (company: AnalysisResult) => void; language: Language; } export const StepReport: React.FC = ({ results, strategy, onRestart, onBack, onStartOutreach, language }) => { const sortedResults = useMemo(() => { return [...results].sort((a, b) => { const tierOrder = { [Tier.TIER_1]: 3, [Tier.TIER_2]: 2, [Tier.TIER_3]: 1 }; const tierDiff = tierOrder[b.tier] - tierOrder[a.tier]; if (tierDiff !== 0) return tierDiff; if (a.status === LeadStatus.POTENTIAL && b.status !== LeadStatus.POTENTIAL) return -1; if (a.status !== LeadStatus.POTENTIAL && b.status === LeadStatus.POTENTIAL) return 1; return 0; }); }, [results]); const getStatusColor = (status: LeadStatus) => { switch (status) { case LeadStatus.CUSTOMER: return 'bg-blue-50 text-blue-700 border-blue-200'; case LeadStatus.COMPETITOR: return 'bg-red-50 text-red-700 border-red-200'; case LeadStatus.POTENTIAL: return 'bg-emerald-50 text-emerald-700 border-emerald-200'; default: return 'bg-slate-50 text-slate-700 border-slate-200'; } }; const getTierColor = (tier: Tier) => { switch (tier) { case Tier.TIER_1: return 'bg-purple-100 text-purple-800 border-purple-200'; case Tier.TIER_2: return 'bg-indigo-50 text-indigo-700 border-indigo-200'; case Tier.TIER_3: return 'bg-slate-50 text-slate-600 border-slate-200'; } }; const downloadMarkdown = () => { if (!strategy || !results) return; const signalHeaders = (strategy.signals || []).map(s => s.name); const headers = ["Company", "Prio", "Rev/Emp", "Status", ...signalHeaders, "Recommendation"]; const rows = sortedResults.map(r => { const signalValues = (strategy.signals || []).map(s => { const data = r.dynamicAnalysis ? r.dynamicAnalysis[s.id] : null; if (!data) return '-'; let content = data.value || '-'; content = content.replace(/\|/g, '\\|'); if (data.proof) { const safeProof = data.proof.replace(/\|/g, '\\|').replace(/(\r\n|\n|\r)/gm, ' '); content += `
*Proof: ${safeProof}*`; } return content; }); const safe = (str: string) => (str || '').replace(/\|/g, '\\|').replace(/(\r\n|\n|\r)/gm, ' '); return `| ${safe(r.companyName)} | ${r.tier} | ${safe(r.revenue)} / ${safe(r.employees)} | ${r.status} | ${signalValues.join(" | ")} | ${safe(r.recommendation)} |`; }); const content = ` # Market Intelligence Report: ${strategy.productContext || 'N/A'} **Context:** ${strategy.idealCustomerProfile || 'N/A'} **Search Strategy ICP:** ${strategy.searchStrategyICP || 'N/A'} **Digital Signals:** ${strategy.digitalSignals || 'N/A'} **Target Pages:** ${strategy.targetPages || 'N/A'} | ${headers.join(" | ")} | |${headers.map(() => "---").join("|")}| ${rows.join("\n")} `; const blob = new Blob([content], { type: 'text/markdown' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `report_${new Date().toISOString().slice(0,10)}.md`; a.click(); URL.revokeObjectURL(url); }; return (

Analysis Report

Build Confirmation: {new Date().toLocaleString()}

Context: {strategy.productContext}

Ideal Customer Profile: {strategy.idealCustomerProfile}

Search Strategy ICP: {strategy.searchStrategyICP}

Digital Signals: {strategy.digitalSignals}

Target Pages: {strategy.targetPages}

{sortedResults.map((row, idx) => ( {/* Column 1: Firmographics */} {/* Column 2: Intelligence (Stacked) */} {/* Column 3: Action */} ))}
Company Profile Strategic Intelligence & Audit Action
{row.companyName}
{row.tier} {row.status}
Revenue {row.revenue}
Employees {row.employees}
Source {row.dataSource}
{/* Recommendation Block */}
AI Recommendation

"{row.recommendation}"

{/* Dynamic Signals Stacked */}
{strategy.signals.map((s, i) => { const data = row.dynamicAnalysis && row.dynamicAnalysis[s.id]; return (
{i + 1}
{s.name}
{data ? data.value : "Nicht geprüft / N/A"}
{data && data.proof && (
Evidence: {data.proof}
)}
); })}
); };