# Phase 4B — Moteur central Live / temps d’attente

Version introduite : **v0.10.0**.

Cette phase pose le stockage central des états opérationnels et temps d’attente. Elle ne dépend d’aucun fournisseur précis : les connecteurs futurs alimenteront tous le même service `LiveDataService`.

## Principes

1. **Historique conservé** : chaque remontée est ajoutée dans `live_observations`.
2. **État courant séparé** : `attraction_live_states` contient uniquement le meilleur état connu actuellement pour chaque attraction.
3. **Pas d’écrasement par une donnée ancienne** : une observation plus vieille reste historisée mais ne remplace pas l’état courant.
4. **Priorité déterministe** : à horodatage identique, le fournisseur ayant la meilleure priorité est retenu. À priorité identique, une source officielle est privilégiée.
5. **Mode dégradé** : une donnée ancienne n’est pas supprimée. L’API continue à la retourner avec une fraîcheur `stale` ou `expired`.
6. **Traçabilité** : fournisseur, source, heure d’observation et heure de récupération restent disponibles.
7. **Extensible** : `queue_data` et `details` permettent d’enregistrer des informations Live supplémentaires sans casser le contrat principal.

## Fraîcheur par défaut

- `fresh` : observation âgée de 0 à 300 secondes ;
- `stale` : plus de 300 secondes et jusqu’à 1 800 secondes ;
- `expired` : plus de 1 800 secondes ;
- `unavailable` : aucune observation connue.

Ces seuils sont configurables dans `.env` :

```text
CW_DATA_LIVE_FRESH_SECONDS=300
CW_DATA_LIVE_STALE_SECONDS=1800
```

Même une donnée `expired` reste disponible comme **dernière donnée connue**, avec son âge clairement exposé.

## Statuts Live

Les statuts normalisés prévus sont :

```text
unknown
open
closed
down
delayed
maintenance
weather
at_capacity
```

## API

La v0.10.0 ajoute :

```text
GET /api/v1/live/attractions
GET /api/v1/parks/{park}/live
GET /api/v1/attractions/{attraction}/live
```

Les réponses indiquent notamment :

- statut Live ;
- ouvert/en fonctionnement ou non lorsque connu ;
- attente principale en minutes ;
- fraîcheur ;
- âge de la donnée ;
- date d’observation ;
- date de récupération ;
- fournisseur et source ;
- données de files supplémentaires (`queues`) ;
- détails additionnels (`details`).

## Administration

Une page **Live** en lecture seule affiche :

- nombre de données fraîches ;
- données anciennes ;
- données expirées ;
- attractions sans donnée Live ;
- derniers états connus et leurs sources.

## Hors périmètre de cette phase

- récupération automatique ThemeParks.wiki / Queue-Times ;
- scheduler Live ;
- prédictions d’attente ;
- statistiques historiques publiques ;
- règles spécifiques à un fournisseur.

Ces éléments pourront s’appuyer sur ce moteur sans modifier le stockage central.
