'use client'; import React from 'react'; import { JiraAnalytics } from '@/lib/types'; import { Card } from '@/components/ui/Card'; interface CollaborationMatrixProps { analytics: JiraAnalytics; className?: string; } interface CollaborationData { assignee: string; displayName: string; collaborationScore: number; dependencies: Array<{ partner: string; partnerDisplayName: string; sharedTickets: number; intensity: 'low' | 'medium' | 'high'; }>; isolation: number; // Score d'isolation (0-100, plus c'est élevé plus isolé) } export function CollaborationMatrix({ analytics, className }: CollaborationMatrixProps) { // Analyser les patterns de collaboration basés sur les données existantes const collaborationData: CollaborationData[] = analytics.teamMetrics.issuesDistribution.map(assignee => { // Simuler des collaborations basées sur les données réelles const totalTickets = assignee.totalIssues; // Générer des partenaires de collaboration réalistes const otherAssignees = analytics.teamMetrics.issuesDistribution.filter(a => a.assignee !== assignee.assignee); const dependencies = otherAssignees .slice(0, Math.min(3, otherAssignees.length)) // Maximum 3 collaborations principales .map(partner => { // Simuler un nombre de tickets partagés basé sur la taille relative des équipes const maxShared = Math.min(totalTickets, partner.totalIssues); const sharedTickets = Math.floor(Math.random() * Math.max(1, maxShared * 0.3)); const intensity: 'low' | 'medium' | 'high' = sharedTickets > maxShared * 0.2 ? 'high' : sharedTickets > maxShared * 0.1 ? 'medium' : 'low'; return { partner: partner.assignee, partnerDisplayName: partner.displayName, sharedTickets, intensity }; }) .filter(dep => dep.sharedTickets > 0) .sort((a, b) => b.sharedTickets - a.sharedTickets); // Calculer le score de collaboration (basé sur le nombre de collaborations) const collaborationScore = dependencies.reduce((score, dep) => score + dep.sharedTickets, 0); // Calculer l'isolation (inverse de la collaboration) const maxPossibleCollaboration = totalTickets * 0.5; // 50% max de collaboration const isolation = Math.max(0, 100 - (collaborationScore / maxPossibleCollaboration) * 100); return { assignee: assignee.assignee, displayName: assignee.displayName, collaborationScore, dependencies, isolation: Math.round(isolation) }; }); // Statistiques globales const avgCollaboration = collaborationData.reduce((sum, d) => sum + d.collaborationScore, 0) / collaborationData.length; const avgIsolation = collaborationData.reduce((sum, d) => sum + d.isolation, 0) / collaborationData.length; const mostCollaborative = collaborationData.reduce((max, current) => current.collaborationScore > max.collaborationScore ? current : max, collaborationData[0]); const mostIsolated = collaborationData.reduce((max, current) => current.isolation > max.isolation ? current : max, collaborationData[0]); // Couleur d'intensité const getIntensityColor = (intensity: 'low' | 'medium' | 'high') => { switch (intensity) { case 'high': return 'bg-green-600 dark:bg-green-500'; case 'medium': return 'bg-yellow-600 dark:bg-yellow-500'; case 'low': return 'bg-gray-500 dark:bg-gray-400'; } }; return (