import React from 'react'; import { ArrowUpIcon, ArrowDownIcon } from '../../icons'; interface ScoreData { seo_score: number; readability_score: number; engagement_score: number; overall_score: number; metadata_completeness_score?: number; // Stage 3: Metadata completeness word_count?: number; has_meta_title?: boolean; has_meta_description?: boolean; has_primary_keyword?: boolean; internal_links_count?: number; has_cluster_mapping?: boolean; // Stage 3: Cluster mapping has_taxonomy_mapping?: boolean; // Stage 3: Taxonomy mapping has_attributes?: boolean; // Stage 3: Attributes } interface OptimizationScoresProps { scores: ScoreData; before?: ScoreData; className?: string; } export const OptimizationScores: React.FC = ({ scores, before, className = '', }) => { const getScoreColor = (score: number) => { if (score >= 80) return 'text-success-600 dark:text-success-400'; if (score >= 60) return 'text-warning-600 dark:text-warning-400'; return 'text-error-600 dark:text-error-400'; }; const getScoreBgColor = (score: number) => { if (score >= 80) return 'bg-success-100 dark:bg-success-900'; if (score >= 60) return 'bg-warning-100 dark:bg-warning-900'; return 'bg-error-100 dark:bg-error-900'; }; const getChangeIcon = (current: number, previous?: number) => { if (!previous) return null; const diff = current - previous; if (diff > 0) return ; if (diff < 0) return ; return ; }; const getChangeText = (current: number, previous?: number) => { if (!previous) return null; const diff = current - previous; if (diff > 0) return `+${diff.toFixed(1)}`; if (diff < 0) return diff.toFixed(1); return '0.0'; }; return (
{/* Overall Score */}
Overall {before && getChangeIcon(scores.overall_score, before.overall_score)}
{scores.overall_score.toFixed(1)} {before && ( {getChangeText(scores.overall_score, before.overall_score)} )}
{/* SEO Score */}
SEO {before && getChangeIcon(scores.seo_score, before.seo_score)}
{scores.seo_score.toFixed(1)} {before && ( {getChangeText(scores.seo_score, before.seo_score)} )}
{/* Readability Score */}
Readability {before && getChangeIcon(scores.readability_score, before.readability_score)}
{scores.readability_score.toFixed(1)} {before && ( {getChangeText(scores.readability_score, before.readability_score)} )}
{/* Engagement Score */}
Engagement {before && getChangeIcon(scores.engagement_score, before.engagement_score)}
{scores.engagement_score.toFixed(1)} {before && ( {getChangeText(scores.engagement_score, before.engagement_score)} )}
{/* Metadata Completeness Score - Stage 3 */}
Metadata {before && scores.metadata_completeness_score !== undefined && getChangeIcon( scores.metadata_completeness_score, before.metadata_completeness_score )}
{(scores.metadata_completeness_score || 0).toFixed(1)} {before && scores.metadata_completeness_score !== undefined && ( {getChangeText(scores.metadata_completeness_score, before.metadata_completeness_score)} )}
{/* Metadata indicators */}
{scores.has_cluster_mapping && ( Cluster )} {scores.has_taxonomy_mapping && ( Taxonomy )} {scores.has_attributes && ( Attributes )}
); };