"use client"; import { Building2, Users, TrendingUp, BarChart3, Target } from "lucide-react"; import { TeamStatsRow, getSkillLevelLabel, getSkillLevelColor, } from "../team-detail/team-stats-row"; interface DirectionOverviewProps { direction: string; teams: Array<{ teamId: string; teamName: string; direction: string; totalMembers: number; averageSkillLevel: number; topSkills: Array<{ skillName: string; averageLevel: number; importance: "incontournable" | "majeure" | "standard"; coverage: number; }>; skillCoverage: number; criticalSkillsCoverage: { incontournable: number; majeure: number; }; }>; totalMembers: number; averageSkillLevel: number; topCategories: Array<{ category: string; averageLevel: number }>; onViewTeamDetails?: (team: any) => void; onExportTeamReport?: (team: any) => void; } // Fonction pour obtenir les couleurs de direction function getDirectionColors(direction: string) { const directionLower = direction.toLowerCase(); if (directionLower.includes("tech") || directionLower.includes("dev")) { return { header: "from-blue-600/30 to-cyan-600/30", border: "border-blue-500/40", icon: "bg-blue-500/20 border-blue-500/30", }; } else if ( directionLower.includes("design") || directionLower.includes("ux") ) { return { header: "from-purple-600/30 to-pink-600/30", border: "border-purple-500/40", icon: "bg-purple-500/20 border-purple-500/30", }; } else if ( directionLower.includes("data") || directionLower.includes("analytics") ) { return { header: "from-emerald-600/30 to-teal-600/30", border: "border-emerald-500/40", icon: "bg-emerald-500/20 border-emerald-500/30", }; } else if ( directionLower.includes("security") || directionLower.includes("sec") ) { return { header: "from-red-600/30 to-orange-600/30", border: "border-red-500/40", icon: "bg-red-500/20 border-red-500/30", }; } else { return { header: "from-purple-600/30 to-blue-600/30", border: "border-purple-500/40", icon: "bg-purple-500/20 border-purple-500/30", }; } } export function DirectionOverview({ direction, teams, totalMembers, averageSkillLevel, topCategories, onViewTeamDetails = () => {}, onExportTeamReport = () => {}, }: DirectionOverviewProps) { const colors = getDirectionColors(direction); // Calculer la moyenne des couvertures des compétences critiques const averageCriticalCoverage = teams.reduce( (acc, team) => { acc.incontournable += team.criticalSkillsCoverage.incontournable; acc.majeure += team.criticalSkillsCoverage.majeure; return acc; }, { incontournable: 0, majeure: 0 } ); averageCriticalCoverage.incontournable /= teams.length || 1; averageCriticalCoverage.majeure /= teams.length || 1; return (

Direction {direction}

{totalMembers}
Niveau: {getSkillLevelLabel(averageSkillLevel)}
{/* Direction Metrics */}
{/* Top Categories */}

Top Catégories

{topCategories.slice(0, 4).map((cat, idx) => (
{cat.category}
{cat.averageLevel.toFixed(1)}
))}
{/* Overall Progress */}

Progression Globale

{/* Compétences incontournables */}
Incontournables: {averageCriticalCoverage.incontournable.toFixed(0)}%
{/* Compétences majeures */}
Majeures: {averageCriticalCoverage.majeure.toFixed(0)}%
{/* Niveau global */}
Niveau global: {((averageSkillLevel / 3) * 100).toFixed(0)}%
{/* Team Distribution */}

Répartition

{teams.length}
équipes actives
Membres par équipe: {(totalMembers / teams.length).toFixed(1)}
Équipes performantes: {teams.filter((t) => t.averageSkillLevel > 2).length}
{/* Teams List */}

Équipes de la direction

{teams.map((team) => ( onViewTeamDetails(team)} onViewReport={() => onExportTeamReport(team)} /> ))}
); }