File size: 3,561 Bytes
c6abe34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
"""
Pydantic models for analytics and metrics schemas.
"""
from datetime import datetime, date
from typing import Optional, List, Dict, Any
from uuid import UUID
from pydantic import BaseModel, Field


class MetricType(BaseModel):
    """Type definition for a metric."""
    name: str
    unit: str
    description: Optional[str] = None


class PlayerMetric(BaseModel):
    """Single metric value for a player."""
    player_id: UUID
    metric_type: str
    value: float
    timestamp: datetime
    video_id: Optional[UUID] = None
    session_id: Optional[UUID] = None


class PlayerAnalyticsSummary(BaseModel):
    """Aggregated analytics summary for a player."""
    player_id: UUID
    period_start: date
    period_end: date
    
    # Performance metrics
    total_training_sessions: int = 0
    total_training_minutes: float = 0.0
    total_videos_analyzed: int = 0
    
    # Movement stats
    total_distance_km: Optional[float] = None
    avg_speed_kmh: Optional[float] = None
    max_speed_kmh: Optional[float] = None
    
    # Skill stats
    total_shot_attempts: int = 0
    total_shots_made: int = 0
    total_shots_missed: int = 0
    shot_success_rate: Optional[float] = Field(None, description="Shot success percentage (0-100)")
    avg_shot_form_consistency: Optional[float] = None
    total_dribbles: int = 0

    
    # Progress indicators
    speed_trend: Optional[str] = Field(None, description="'improving', 'stable', 'declining'")
    form_trend: Optional[str] = None
    
    class Config:
        from_attributes = True


class TeamAnalyticsSummary(BaseModel):
    """Aggregated analytics summary for a team."""
    organization_id: UUID
    period_start: date
    period_end: date
    
    # Team stats
    total_games_analyzed: int = 0
    total_training_sessions: int = 0
    
    # Possession
    avg_possession_percent: Optional[float] = None
    
    # Passing
    total_passes: int = 0
    avg_passes_per_game: Optional[float] = None
    pass_success_rate: Optional[float] = None
    
    # Shooting
    total_shot_attempts: int = 0
    total_shots_made: int = 0
    team_shooting_percentage: Optional[float] = None
    
    # Defense
    total_interceptions: int = 0
    avg_interceptions_per_game: Optional[float] = None

    
    class Config:
        from_attributes = True


class SkillSummary(BaseModel):
    """Personal skill summary for dashboard display."""
    player_id: UUID
    last_updated: datetime
    
    # Overall scores (0-100)
    overall_score: float = Field(..., ge=0, le=100)
    shooting_score: float = Field(..., ge=0, le=100)
    dribbling_score: float = Field(..., ge=0, le=100)
    movement_score: float = Field(..., ge=0, le=100)
    consistency_score: float = Field(..., ge=0, le=100)
    
    # Recent session summary
    last_session_date: Optional[date] = None
    last_session_duration_minutes: Optional[float] = None
    
    # Improvement areas
    strengths: List[str] = Field(default_factory=list)
    areas_to_improve: List[str] = Field(default_factory=list)
    
    # Recommendations
    recommendations: List[str] = Field(default_factory=list)


class ProgressData(BaseModel):
    """Progress tracking data point."""
    date: date
    value: float
    metric_type: str


class ProgressReport(BaseModel):
    """Progress report over time."""
    player_id: UUID
    metric_type: str
    period_start: date
    period_end: date
    data_points: List[ProgressData]
    trend: str = Field(..., description="'improving', 'stable', 'declining'")
    percent_change: Optional[float] = None