"use client"; import React, { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Progress } from "@/components/ui/progress"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Users, TrendingUp, Target, Award, BarChart3, ArrowLeft, Download, UserCheck, GraduationCap, Building2, Star, BookOpen, X, User, Brain, Coffee, Lightbulb, MessageSquare, } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { TeamStats, TeamMember } from "@/services/admin-service"; import { TechIcon } from "@/components/icons/tech-icon"; interface TeamDetailClientWrapperProps { team: TeamStats; teamId: string; } interface SkillAnalysis { skillName: string; category: string; experts: Array<{ name: string; level: number; canMentor: boolean; }>; learners: Array<{ name: string; currentLevel: number; }>; averageLevel: number; totalEvaluations: number; expertCount: number; learnerCount: number; proficiencyRate: number; } function getSkillLevelLabel(level: number): string { if (level < 0.5) return "Débutant"; if (level < 1.5) return "Intermé."; if (level < 2.5) return "Avancé"; return "Expert"; } function getSkillLevelColor(level: number): string { if (level < 0.5) return "bg-red-500"; if (level < 1.5) return "bg-orange-500"; if (level < 2.5) return "bg-blue-500"; return "bg-green-500"; } function getSkillLevelBadgeClasses(level: number): string { if (level < 0.5) return "bg-red-500/20 border-red-500/30 text-red-300"; if (level < 1.5) return "bg-orange-500/20 border-orange-500/30 text-orange-300"; if (level < 2.5) return "bg-blue-500/20 border-blue-500/30 text-blue-300"; return "bg-green-500/20 border-green-500/30 text-green-300"; } export function TeamDetailClientWrapper({ team, teamId, }: TeamDetailClientWrapperProps) { const router = useRouter(); const [skillAnalysis, setSkillAnalysis] = useState([]); const [selectedMember, setSelectedMember] = useState(null); const [isMemberModalOpen, setIsMemberModalOpen] = useState(false); const [selectedCategory, setSelectedCategory] = useState("all"); useEffect(() => { // Analyser les compétences avec les vraies données const skillMap = new Map(); team.members.forEach((member) => { member.skills.forEach((skill) => { if (!skillMap.has(skill.skillName)) { skillMap.set(skill.skillName, { skillName: skill.skillName, category: skill.category, experts: [], learners: [], averageLevel: 0, totalEvaluations: 0, }); } const skillData = skillMap.get(skill.skillName); skillData.totalEvaluations++; skillData.averageLevel += skill.level; if (skill.level >= 2) { skillData.experts.push({ name: `${member.firstName} ${member.lastName}`, level: skill.level, canMentor: skill.canMentor, }); } if (skill.wantsToLearn) { skillData.learners.push({ name: `${member.firstName} ${member.lastName}`, currentLevel: skill.level, }); } }); }); const skills = Array.from(skillMap.values()) .map( (skill): SkillAnalysis => ({ ...skill, averageLevel: skill.averageLevel / skill.totalEvaluations, expertCount: skill.experts.length, learnerCount: skill.learners.length, proficiencyRate: (skill.experts.length / skill.totalEvaluations) * 100, }) ) .sort((a, b) => b.averageLevel - a.averageLevel); setSkillAnalysis(skills); }, [team]); const handleExportReport = () => { const reportData = { team: team.teamName, direction: team.direction, exportDate: new Date().toLocaleDateString(), detailedStats: { totalMembers: team.totalMembers, averageSkillLevel: team.averageSkillLevel, skillCoverage: team.skillCoverage, expertiseDistribution: { beginners: team.members.filter( (m) => m.skills.reduce((avg, s) => avg + s.level, 0) / m.skills.length < 1 ).length, intermediate: team.members.filter((m) => { const avg = m.skills.reduce((avg, s) => avg + s.level, 0) / m.skills.length; return avg >= 1 && avg < 2; }).length, advanced: team.members.filter((m) => { const avg = m.skills.reduce((avg, s) => avg + s.level, 0) / m.skills.length; return avg >= 2 && avg < 3; }).length, experts: team.members.filter( (m) => m.skills.reduce((avg, s) => avg + s.level, 0) / m.skills.length >= 3 ).length, }, }, members: team.members.map((member) => ({ name: `${member.firstName} ${member.lastName}`, joinDate: member.joinDate, skillCount: member.skills.length, averageLevel: member.skills.reduce((avg, s) => avg + s.level, 0) / member.skills.length, expertSkills: member.skills.filter((s) => s.level >= 2 && s.canMentor) .length, learningGoals: member.skills.filter((s) => s.wantsToLearn).length, skills: member.skills, })), skillAnalysis: skillAnalysis.map((skill) => ({ name: skill.skillName, category: skill.category, averageLevel: skill.averageLevel, totalEvaluations: skill.totalEvaluations, expertCount: skill.expertCount, learnerCount: skill.learnerCount, proficiencyRate: skill.proficiencyRate, experts: skill.experts, learners: skill.learners, })), insights: { topPerformingSkills: skillAnalysis.slice(0, 5).map((s) => ({ name: s.skillName, level: s.averageLevel, proficiency: s.proficiencyRate, })), skillsNeedingDevelopment: skillAnalysis .filter((s) => s.averageLevel < 1.5) .slice(0, 5) .map((s) => ({ name: s.skillName, level: s.averageLevel, learners: s.learnerCount, })), mentorshipOpportunities: skillAnalysis .filter((s) => s.experts.filter((e) => e.canMentor).length > 0) .map((s) => ({ skill: s.skillName, mentors: s.experts.filter((e) => e.canMentor).map((e) => e.name), potentialMentees: s.learners.map((l) => l.name), })), }, }; const dataStr = JSON.stringify(reportData, null, 2); const dataUri = "data:application/json;charset=utf-8," + encodeURIComponent(dataStr); const exportFileDefaultName = `rapport-detaille-${team.teamName.toLowerCase()}-${ new Date().toISOString().split("T")[0] }.json`; const linkElement = document.createElement("a"); linkElement.setAttribute("href", dataUri); linkElement.setAttribute("download", exportFileDefaultName); linkElement.click(); }; const categories = Array.from(new Set(skillAnalysis.map((s) => s.category))); const filteredSkills = selectedCategory === "all" ? skillAnalysis : skillAnalysis.filter((s) => s.category === selectedCategory); const teamInsights = { averageTeamLevel: team.members.reduce((sum, member) => { const memberAvg = member.skills.reduce((s, skill) => s + skill.level, 0) / member.skills.length; return sum + memberAvg; }, 0) / team.members.length, totalExperts: team.members.reduce( (sum, member) => sum + member.skills.filter((s) => s.level >= 2 && s.canMentor).length, 0 ), totalLearners: team.members.reduce( (sum, member) => sum + member.skills.filter((s) => s.wantsToLearn).length, 0 ), skillGaps: skillAnalysis.filter((s) => s.averageLevel < 1.5).length, strongSkills: skillAnalysis.filter((s) => s.averageLevel >= 2.5).length, }; return (
{/* Background Effects */}
{/* Header avec breadcrumb et actions */}
|

{team.teamName}

{team.direction}

{/* Métriques principales */}
Membres
{team.totalMembers}
personnes actives
Niveau équipe
{((teamInsights.averageTeamLevel / 3) * 100).toFixed(0)}%
{getSkillLevelLabel(teamInsights.averageTeamLevel)}
Expertises
{teamInsights.totalExperts}
compétences expertes
Apprentissages
{teamInsights.totalLearners}
objectifs d'apprentissage
Lacunes
{teamInsights.skillGaps}
compétences à renforcer
{/* Contenu principal avec onglets */}
Vue d'ensemble Compétences Membres Insights
{/* Onglet Vue d'ensemble */} {/* Top Skills avec design amélioré */}

Top Compétences de l'équipe

{team.topSkills.slice(0, 6).map((skill, idx) => (
{skill.icon && (
)} {skill.skillName}
{skill.averageLevel.toFixed(1)} {getSkillLevelLabel(skill.averageLevel)}
))}
{/* Distribution des niveaux */}

Répartition des niveaux

{[ { label: "Expert", count: team.members.filter( (m) => m.skills.reduce((avg, s) => avg + s.level, 0) / m.skills.length >= 2.5 ).length, color: "bg-green-500", }, { label: "Avancé", count: team.members.filter((m) => { const avg = m.skills.reduce((avg, s) => avg + s.level, 0) / m.skills.length; return avg >= 2 && avg < 2.5; }).length, color: "bg-blue-500", }, { label: "Intermédiaire", count: team.members.filter((m) => { const avg = m.skills.reduce((avg, s) => avg + s.level, 0) / m.skills.length; return avg >= 1 && avg < 2; }).length, color: "bg-orange-500", }, { label: "Débutant", count: team.members.filter( (m) => m.skills.reduce((avg, s) => avg + s.level, 0) / m.skills.length < 1 ).length, color: "bg-red-500", }, ].map((level, idx) => (
{level.label}
{level.count}
{((level.count / team.totalMembers) * 100).toFixed(0)} %
))}

Métriques clés

Couverture des compétences {team.skillCoverage.toFixed(1)}%
Compétences fortes {teamInsights.strongSkills}
Objectifs d'apprentissage {teamInsights.totalLearners}
Mentors disponibles {skillAnalysis.reduce( (sum, skill) => sum + skill.experts.filter((e) => e.canMentor).length, 0 )}
{/* Onglet Compétences */} {/* Filtres par catégorie */}
{categories.map((category) => ( ))}
{/* Liste des compétences détaillée */}
{filteredSkills.map((skill, idx) => (

{skill.skillName}

{skill.category}

{getSkillLevelLabel(skill.averageLevel)}
Niveau moyen: {skill.averageLevel.toFixed(1)}/3
{skill.totalEvaluations}
Évaluations
{skill.expertCount}
Experts
{skill.learnerCount}
Apprenants
{skill.experts.filter((e) => e.canMentor).length > 0 && (
Mentors disponibles:
{skill.experts .filter((e) => e.canMentor) .slice(0, 2) .map((expert, i) => ( {expert.name} ))} {skill.experts.filter((e) => e.canMentor).length > 2 && ( + {skill.experts.filter((e) => e.canMentor).length - 2} )}
)}
))}
{/* Onglet Membres */}
{team.members.map((member) => { const memberAvg = member.skills.reduce((sum, skill) => sum + skill.level, 0) / member.skills.length; const expertSkills = member.skills.filter( (s) => s.level >= 2 && s.canMentor ).length; const learningGoals = member.skills.filter( (s) => s.wantsToLearn ).length; return (
{ setSelectedMember(member); setIsMemberModalOpen(true); }} >
{member.firstName} {member.lastName}
{new Date(member.joinDate).toLocaleDateString()}
{getSkillLevelLabel(memberAvg)}
Niveau moyen: {memberAvg.toFixed(1)}/3
{member.skills.length}
Compétences
{expertSkills}
Expertises
{learningGoals}
Objectifs
{expertSkills > 0 && (
Peut mentorer {expertSkills} compétence {expertSkills > 1 ? "s" : ""}
)} {learningGoals > 0 && (
Souhaite apprendre {learningGoals} compétence {learningGoals > 1 ? "s" : ""}
)}
); })}
{/* Onglet Insights */}
{/* Compétences à développer */}

Compétences à développer

{skillAnalysis .filter((s) => s.averageLevel < 1.5) .slice(0, 5) .map((skill, idx) => (
{skill.skillName}
{skill.category}
{skill.averageLevel.toFixed(1)}
{skill.learnerCount} intéressés
))}
{/* Opportunités de mentorat */}

Opportunités de mentorat

{skillAnalysis .filter( (s) => s.experts.filter((e) => e.canMentor).length > 0 && s.learnerCount > 0 ) .slice(0, 5) .map((skill, idx) => (
{skill.skillName}
{skill.category}
{skill.experts.filter((e) => e.canMentor).length}{" "} mentor {skill.experts.filter((e) => e.canMentor).length > 1 ? "s" : ""}
{skill.learnerCount} apprenant {skill.learnerCount > 1 ? "s" : ""}
))}
{/* Recommandations */}

Recommandations pour l'équipe

🎯 Formations prioritaires

Organiser des formations sur{" "} {skillAnalysis .filter((s) => s.averageLevel < 1.5) .slice(0, 2) .map((s) => s.skillName) .join(" et ")} pour combler les lacunes identifiées.

🤝 Programme de mentorat

Mettre en place un système de mentorat avec{" "} {skillAnalysis.reduce( (sum, skill) => sum + skill.experts.filter((e) => e.canMentor).length, 0 )}{" "} mentors disponibles.

📈 Capitaliser sur les forces

Exploiter l'expertise en{" "} {skillAnalysis .filter((s) => s.averageLevel >= 2.5) .slice(0, 2) .map((s) => s.skillName) .join(" et ")} pour des projets ambitieux.

🔄 Plan de développement

Créer des parcours de montée en compétences personnalisés pour {teamInsights.totalLearners} objectifs d'apprentissage.

{/* Modal détail membre */} {selectedMember && (
{selectedMember.firstName} {selectedMember.lastName}

Membre depuis le{" "} {new Date(selectedMember.joinDate).toLocaleDateString()}

)}
{selectedMember && (
{/* Stats du membre */}
{selectedMember.skills.length}
Compétences évaluées
{ selectedMember.skills.filter( (s) => s.level >= 2 && s.canMentor ).length }
Peut mentorer
{ selectedMember.skills.filter((s) => s.wantsToLearn) .length }
Souhaite apprendre
{/* Compétences détaillées */}

Portfolio de compétences

{selectedMember.skills .sort((a, b) => b.level - a.level) .map((skill, idx) => (
{skill.skillName}
{skill.category}
{getSkillLevelLabel(skill.level)}
{skill.canMentor && ( Mentor )} {skill.wantsToLearn && ( Apprenant )}
))}
)}
); }