import React, { useState } from 'react'; import { BlogOutlineSection, SourceMappingStats, GroundingInsights, OptimizationResults, ResearchCoverage } from '../../services/blogWriterApi'; interface OutlineIntelligenceChipsProps { sections: BlogOutlineSection[]; sourceMappingStats?: SourceMappingStats | null; groundingInsights?: GroundingInsights | null; optimizationResults?: OptimizationResults | null; researchCoverage?: ResearchCoverage | null; } const OutlineIntelligenceChips: React.FC = ({ sections, sourceMappingStats, groundingInsights, optimizationResults, researchCoverage }) => { const [activeModal, setActiveModal] = useState(null); const getConfidenceColor = (score: number) => { if (score >= 0.8) return '#4caf50'; // Green if (score >= 0.6) return '#ff9800'; // Orange return '#f44336'; // Red }; const getQualityGrade = (score: number) => { if (score >= 9) return { grade: 'A+', color: '#4caf50' }; if (score >= 8) return { grade: 'A', color: '#4caf50' }; if (score >= 7) return { grade: 'B+', color: '#8bc34a' }; if (score >= 6) return { grade: 'B', color: '#ff9800' }; if (score >= 5) return { grade: 'C', color: '#ff9800' }; return { grade: 'D', color: '#f44336' }; }; const chips = [ { id: 'research', label: 'Research Data', icon: '📊', color: '#e3f2fd', textColor: '#1976d2', data: researchCoverage, description: 'How well your research data is being utilized', metrics: researchCoverage ? [ { label: 'Sources Used', value: researchCoverage.sources_utilized, color: '#1976d2' }, { label: 'Content Gaps', value: researchCoverage.content_gaps_identified, color: '#ff9800' }, { label: 'Advantages', value: researchCoverage.competitive_advantages.length, color: '#4caf50' } ] : [] }, { id: 'mapping', label: 'Source Mapping', icon: '🔗', color: '#f3e5f5', textColor: '#7b1fa2', data: sourceMappingStats, description: 'Intelligence in mapping sources to sections', metrics: sourceMappingStats ? [ { label: 'Mapped', value: sourceMappingStats.total_sources_mapped, color: '#7b1fa2' }, { label: 'Coverage', value: `${Math.round(sourceMappingStats.coverage_percentage)}%`, color: getConfidenceColor(sourceMappingStats.coverage_percentage / 100) }, { label: 'Relevance', value: `${Math.round(sourceMappingStats.average_relevance_score * 100)}%`, color: getConfidenceColor(sourceMappingStats.average_relevance_score) }, { label: 'High Conf', value: sourceMappingStats.high_confidence_mappings, color: '#4caf50' } ] : [] }, { id: 'grounding', label: 'Grounding Insights', icon: '🧠', color: '#e8f5e8', textColor: '#2e7d32', data: groundingInsights, description: 'AI-powered insights from search grounding', metrics: groundingInsights ? [ { label: 'Confidence', value: groundingInsights.confidence_analysis ? `${Math.round(groundingInsights.confidence_analysis.average_confidence * 100)}%` : 'N/A', color: groundingInsights.confidence_analysis ? getConfidenceColor(groundingInsights.confidence_analysis.average_confidence) : '#666' }, { label: 'Authority', value: groundingInsights.authority_analysis ? `${Math.round(groundingInsights.authority_analysis.average_authority_score * 100)}%` : 'N/A', color: groundingInsights.authority_analysis ? getConfidenceColor(groundingInsights.authority_analysis.average_authority_score) : '#666' }, { label: 'Coverage', value: groundingInsights.content_relationships ? `${Math.round(groundingInsights.content_relationships.concept_coverage_score * 100)}%` : 'N/A', color: groundingInsights.content_relationships ? getConfidenceColor(groundingInsights.content_relationships.concept_coverage_score) : '#666' } ] : [] }, { id: 'optimization', label: 'Optimization', icon: '🎯', color: '#fff3e0', textColor: '#f57c00', data: optimizationResults, description: 'AI optimization and quality assessment', metrics: optimizationResults ? [ { label: 'Quality', value: `${optimizationResults.overall_quality_score}/10`, color: getQualityGrade(optimizationResults.overall_quality_score).color }, { label: 'Grade', value: getQualityGrade(optimizationResults.overall_quality_score).grade, color: getQualityGrade(optimizationResults.overall_quality_score).color }, { label: 'Focus', value: optimizationResults.optimization_focus, color: '#f57c00' }, { label: 'Improvements', value: optimizationResults.improvements_made.length, color: '#4caf50' } ] : [] } ]; const renderModal = (chipId: string) => { const chip = chips.find(c => c.id === chipId); if (!chip || !chip.data) return null; return (
{/* Modal Header */}

{chip.icon} {chip.label}

{chip.description}

{/* Modal Content */}
{chipId === 'research' && researchCoverage && (
{/* Key Metrics */}

Research Utilization Metrics

{researchCoverage.sources_utilized}
Sources Utilized
Research sources actively used in outline generation
{researchCoverage.content_gaps_identified}
Content Gaps Identified
Missing topics that could strengthen your content
{researchCoverage.competitive_advantages.length}
Competitive Advantages
Unique angles identified from research
{/* Competitive Advantages */} {researchCoverage.competitive_advantages.length > 0 && (

Key Competitive Advantages

{researchCoverage.competitive_advantages.map((advantage, i) => ( {advantage} ))}
)}
)} {chipId === 'mapping' && sourceMappingStats && (

Source Mapping Intelligence

{sourceMappingStats.total_sources_mapped}
Sources Mapped
Research sources intelligently linked to sections
{Math.round(sourceMappingStats.coverage_percentage)}%
Coverage
Percentage of sections with mapped sources
{Math.round(sourceMappingStats.average_relevance_score * 100)}%
Avg Relevance
How well sources match section content
{sourceMappingStats.high_confidence_mappings}
High Confidence
Mappings with >80% confidence score
)} {chipId === 'grounding' && groundingInsights && (

Grounding Metadata Insights

{/* Confidence Analysis */} {groundingInsights.confidence_analysis && (

Confidence Analysis

{Math.round(groundingInsights.confidence_analysis.average_confidence * 100)}%
Avg Confidence
Average confidence score across all sources
{groundingInsights.confidence_analysis.high_confidence_sources_count}
High Confidence Sources
Sources with >80% confidence score
)} {/* Authority Analysis */} {groundingInsights.authority_analysis && (

Authority Analysis

{Math.round(groundingInsights.authority_analysis.average_authority_score * 100)}%
Avg Authority
Average authority score of sources
{groundingInsights.authority_analysis.high_authority_sources.length > 0 && (
Top Authority Sources:
{groundingInsights.authority_analysis.high_authority_sources.slice(0, 5).map((source, i) => ( {source.title.substring(0, 40)}... ))}
)}
)} {/* Content Relationships */} {groundingInsights.content_relationships && (

Content Relationships

{Math.round(groundingInsights.content_relationships.concept_coverage_score * 100)}%
Concept Coverage
How well concepts are covered across sections
{groundingInsights.content_relationships.related_concepts.length > 0 && (
Related Concepts:
{groundingInsights.content_relationships.related_concepts.slice(0, 8).map((concept, i) => ( {concept} ))}
)}
)} {/* Search Intent */} {groundingInsights.search_intent_insights && (

Search Intent Analysis

{groundingInsights.search_intent_insights.primary_intent}
Primary Intent
Main user intent identified from search data
{groundingInsights.search_intent_insights.user_questions.length > 0 && (
User Questions:
{groundingInsights.search_intent_insights.user_questions.slice(0, 5).map((question, i) => ( {question.substring(0, 50)}... ))}
)}
)}
)} {chipId === 'optimization' && optimizationResults && (

Optimization Results

{optimizationResults.overall_quality_score}/10
Overall Quality
AI-assessed quality score of the outline
{getQualityGrade(optimizationResults.overall_quality_score).grade}
Quality Grade
Letter grade based on quality assessment
{optimizationResults.optimization_focus}
Focus Area
Primary area of optimization focus
{optimizationResults.improvements_made.length}
Improvements Made
Number of optimizations applied
{optimizationResults.improvements_made.length > 0 && (

Improvements Made:

    {optimizationResults.improvements_made.map((improvement, i) => (
  • {improvement}
  • ))}
)}
)}
); }; const availableChips = chips.filter(chip => chip.data); if (availableChips.length === 0) return null; return ( <>
{availableChips.map(chip => ( ))}
{activeModal && renderModal(activeModal)} ); }; export default OutlineIntelligenceChips;