# SPECS — Sargasse-Sentry

## Vision Produit

Sargasse-Sentry est une plateforme de renseignement maritime autonome transformant des données satellites brutes en information directement exploitable pour la prise de décision terrain.

Le produit ne doit pas être perçu comme une carte, mais comme un **outil d'aide à la décision en environnement incertain**, avec un focus sur :

- anticipation
- lisibilité immédiate
- confiance dans la donnée

### Utilisateurs cibles

| Profil | Usage |
|---|---|
| Marins-pêcheurs | Décision de sortie |
| Surfeurs | Qualité du spot |
| Baigneurs | Sécurité / nuisance |

### Contraintes produit

- Gratuit
- Sans inscription obligatoire (sauf alertes push, voir Roadmap V3)
- Mobile-first
- Compréhensible en moins de 3 secondes

---

## UX — Logique Produit

### Mode principal : Spot Mode

L'utilisateur sélectionne un point côtier → affichage :

| Horizon | Indicateur |
|---|---|
| Aujourd'hui | OK / Risque / Impact |
| +24h | OK / Risque / Impact |
| +48h | OK / Risque / Impact |

### Timeline interactive

Slider temporel : `Now → +6h → +12h → +24h → +48h`

Met à jour en temps réel :
- les polygones sur la carte
- le score d'impact

### Impact Score

Calcul basé sur :

```
score = f(distance côte, densité, vitesse d'approche, évolution tendancielle)
```

| Score | Niveau |
|---|---|
| 0–30 | OK |
| 30–70 | Risque |
| 70–100 | Impact |

### Visualisation

- Gradients radiaux pour la densité
- Contour épais pour la lisibilité
- Animation légère **uniquement** sur les prédictions (pas les observations)

### Boucle d'apprentissage (différenciateur)

Bouton : **"Je confirme présence de sargasses"**

Stocke un `UserFeedback` anonyme (localisation, timestamp, confirmation, densité estimée).

---

## Pipeline de Données

### Étape 1 — Ingestion
- Cron Symfony toutes les 3h
- Appel API Sentinel Hub
- Récupération bandes B04 (RED), B08 (NIR), B11 (SWIR1)
- Création d'un `DataIngestionJob`

### Étape 2 — Pré-traitement
- Filtrage nuages : rejet si `cloudCoverage > seuil`
- Seuil configurable par région (défaut 60% — peut être ajusté pour zones tropicales à forte nébulosité)

### Étape 3 — Calcul AFAI

Formule complète :

```
AFAI = R_NIR - R_RED - (R_SWIR1 - R_RED) × (λ_NIR - λ_RED) / (λ_SWIR1 - λ_RED)
```

- `R_*` : réflectance de surface des bandes Sentinel
- `λ_*` : longueurs d'onde centrales (constantes fixes par capteur)

Résultat : raster binaire (sargasse / non-sargasse)

### Étape 4 — Vectorisation
- Raster → polygones
- Simplification Douglas-Peucker
- Suppression du bruit (polygones < seuil surface minimal)

### Étape 5 — Simulation de dérive (CRITIQUE)

Ne pas appliquer de translation globale.

Algorithme :
1. **Échantillonnage** du polygone : génération de points internes (centroids + random sampling)
2. **Pour chaque point** : récupération vent + courant (GRIB NOAA) → application du vecteur de dérive
3. **Reconstruction** du polygone : convex hull ou alpha shape
4. **Génération des horizons** : H+6, H+12, H+24, H+48

### Sources de données

| Source | Usage | Notes |
|---|---|---|
| Sentinel-2 | Observations haute résolution | Faible fréquence |
| Sentinel-3 | Fallback | Fréquence élevée |
| NOAA GRIB | Vent + courant | Gratuit, accès HTTP direct |

---

## Performance

### Caching

- **Redis** : résultats API, scores d'impact
- **HTTP Cache** : endpoints publics, tiles statiques
- **Cloudflare free tier** (optionnel, sans coût) : CDN pour les vector tiles statiques

### Stratégie

- 1 requête = 1 zone + 1 timestamp
- Pas de recalcul à la volée
- Scores pré-calculés à chaque ingestion

---

## Sécurité & Résilience

- Retry automatique sur ingestion échouée
- Fallback Sentinel-2 → Sentinel-3 si indisponible
- Logs détaillés sur chaque `DataIngestionJob`
- Monitoring des erreurs pipeline
- Rate limiting sur les endpoints publics

---

## Roadmap

### MVP
- Ingestion Sentinel-2
- Calcul AFAI + vectorisation
- Affichage polygones (observations uniquement)
- Zone géographique : Antilles

### V2
- Dérive H+6 / H+12 / H+24 / H+48
- Score d'impact par `CoastalPoint`
- Interface Spot Mode complète

### V3
- Alertes push (nécessite inscription légère : push token ou email — à concevoir en minimisant la friction)
- Boucle feedback utilisateur (`UserFeedback`)
- Amélioration du modèle de dérive via données terrain
