# Story 3.2: Implémenter le système de calcul de prédictions

Status: review

## Acceptance Criteria

**Given** les scores d'énergie sont calculés pour deux équipes
**When** le système calcule la prédiction
**Then** il compare les scores d'énergie des deux équipes
**And** il calcule le Confidence Meter (0-100%) basé sur la différence d'énergie
**And** il détermine l'équipe prédite gagnante
**And** la prédiction est stockée dans la base de données

**Given** une prédiction est générée
**When** elle est sauvegardée
**Then** elle est associée au match correspondant
**And** elle contient timestamp, confidence, et équipe prédite

## Tasks / Subtasks

- [x] Créer le module de calcul de prédictions (AC: #1)
  - [x] Créer `backend/app/ml/prediction_calculator.py`
  - [x] Implémenter la logique de comparaison des scores d'énergie
  - [x] Implémenter le calcul du Confidence Meter
  - [x] Déterminer l'équipe gagnante
  - [x] Valider les résultats

- [x] Implémenter le calcul du Confidence Meter (AC: #1)
  - [x] Calculer la différence d'énergie entre les deux équipes
  - [x] Convertir la différence en pourcentage (0-100%)
  - [x] Normaliser le score final
  - [x] Documenter la formule utilisée
  - [x] Tester avec des exemples

- [x] Créer les schémas de base de données pour prédictions (AC: #1)
  - [x] Mise à jour de la table `predictions` (déjà créée dans 3.1)
  - [x] Ajouter colonnes si nécessaires
  - [x] Générer et appliquer les migrations

- [x] Implémenter le service de création de prédictions (AC: #1, #2)
  - [x] Créer `backend/app/services/prediction_service.py`
  - [x] Créer la fonction de génération de prédiction pour un match
  - [x] Stocker la prédiction dans la base de données
  - [x] Lier la prédiction au match
  - [x] Gérer les erreurs

- [x] Créer l'endpoint API pour générer des prédictions (AC: #2)
  - [x] Créer `POST /api/v1/matches/{match_id}/predict`
  - [x] Valider les entrées avec Pydantic
  - [x] Appeler le service de prédiction
  - [x] Retourner la prédiction créée
  - [x] Documenter l'endpoint avec Swagger

- [x] Tester le système de prédictions (AC: #1, #2)
  - [x] Tester le calcul de prédictions pour des matchs réels
  - [x] Valider le Confidence Meter
  - [x] Tester l'endpoint API
  - [x] Vérifier que les prédictions sont stockées
  - [x] Tester les relations match → predictions

## Dev Notes

### Formule de Calcul

```python
def calculate_prediction(home_energy: float, away_energy: float):
    # Différence d'énergie
    energy_diff = abs(home_energy - away_energy)
    
    # Calcul du Confidence Meter (0-100%)
    confidence = min(100, energy_diff * 2)  # Exemple simple
    
    # Déterminer l'équipe gagnante
    if home_energy > away_energy:
        predicted_winner = 'home'
    elif away_energy > home_energy:
        predicted_winner = 'away'
    else:
        predicted_winner = 'draw'
    
    return {
        'confidence': confidence,
        'predicted_winner': predicted_winner,
        'home_energy': home_energy,
        'away_energy': away_energy
    }
```

### File Structure

```
backend/app/
├── ml/
│   └── prediction_calculator.py
├── services/
│   └── prediction_service.py
└── api/v1/
    └── predictions.py
```

### References

- [Source: _bmad-output/planning-artifacts/epics.md#Story-3.2]

## Dev Agent Record

### Agent Model Used

GLM-4.7

### Completion Notes List

- Système de calcul de prédictions implémenté avec 4 fonctions principales :
  - `calculate_confidence_meter()`: Calcule le Confidence Meter (0-100%) basé sur la différence d'énergie
  - `determine_winner()`: Détermine l'équipe gagnante (home/away/draw)
  - `calculate_prediction()`: Fonction principale combinant confidence et winner
  - `validate_prediction_result()`: Valide les résultats de prédiction
- Confidence Meter fonctionnel avec la formule : `min(100, abs(home_energy - away_energy) * 2)`
- Service de prédiction (`PredictionService`) créé avec méthodes complètes :
  - `create_prediction_for_match()`: Crée et stocke une prédiction
  - `get_prediction_by_id()`: Récupère une prédiction par ID
  - `get_predictions_for_match()`: Récupère toutes les prédictions d'un match
  - `get_latest_prediction_for_match()`: Récupère la prédiction la plus récente
  - `delete_prediction()`: Supprime une prédiction
- Endpoint API REST complet créé avec 5 routes :
  - `POST /api/v1/predictions/matches/{match_id}/predict`: Crée une prédiction
  - `GET /api/v1/predictions/{prediction_id}`: Récupère une prédiction
  - `GET /api/v1/predictions/matches/{match_id}`: Récupère toutes les prédictions d'un match
  - `GET /api/v1/predictions/matches/{match_id}/latest`: Récupère la prédiction la plus récente
  - `DELETE /api/v1/predictions/{prediction_id}`: Supprime une prédiction
- Tests complets créés pour :
  - Le calculateur de prédictions (test_prediction_calculator.py)
  - Le service de prédictions (test_prediction_service.py)
  - L'endpoint API (test_prediction_api.py)
- Intégration complète dans main.py

### File List

- `backend/app/ml/prediction_calculator.py` (nouveau fichier)
- `backend/app/services/prediction_service.py` (nouveau fichier)
- `backend/app/api/v1/predictions.py` (nouveau fichier)
- `backend/tests/test_prediction_calculator.py` (nouveau fichier)
- `backend/tests/test_prediction_service.py` (nouveau fichier)
- `backend/tests/test_prediction_api.py` (nouveau fichier)
- `backend/app/main.py` (modifié : ajout des routes de prédictions)
