# TRAIL DPS 4.2 - Lot WEB - Partage sécurisé position coureur vers RESCUE

## Objectif
Ajouter côté OVH un flux séparé permettant à PLACE de créer un lien sécurisé TrailDPS vers la position d'un coureur déjà localisé, puis d'envoyer ce lien par SMS à l'équipe RESCUE affectée.

## Périmètre
- Aucun changement Android/iOS.
- Aucun changement du flux coureur one-shot existant.
- Aucune donnée médicale.
- Filtrage strict par `place_instance_id` et `event_remote_id`.

## Nouveaux fichiers
- `SRC/Tracking/RescueLocationShareRepository.php`
- `public/api/rescue/share_location_create.php`
- `public/api/rescue/share_location_status.php`
- `public/api/rescue/share_location_cancel.php`
- `public/rescue/location.php`
- `sql/lot_4_2_rescue_location_share.sql`

## Endpoints
### POST `/api/rescue/share_location_create.php`
Headers : `X-Api-Key: ...`

Payload minimal :
```json
{
  "place_instance_id": "PLACE-001",
  "event_remote_id": "EVT-2026-001",
  "runner_request_id": 123,
  "phone": "+33600000000"
}
```

Payload recommandé après affectation intervention :
```json
{
  "place_instance_id": "PLACE-001",
  "event_remote_id": "EVT-2026-001",
  "runner_request_id": 123,
  "phone": "+33600000000",
  "rescue_team_label": "RESCUE 2",
  "local_incident_id": 45,
  "rescue_binding_id": 8,
  "rescue_device_id": 12,
  "expires_in_minutes": 180
}
```

La création est refusée si la demande coureur n'est pas en `LOCATION_RECEIVED` ou `INCIDENT_CREATED`.

### GET `/api/rescue/share_location_status.php`
Paramètres : `place_instance_id`, `event_remote_id`, optionnels `runner_request_id`, `status`, `limit`.

### POST `/api/rescue/share_location_cancel.php`
Payload : `place_instance_id`, `event_remote_id`, `share_id`.

### GET `/rescue/location.php?token=...`
Page mobile sécurisée pour RESCUE avec coordonnées, précision, horodatage et boutons Maps/Waze.

## Configuration optionnelle
Le lot fonctionne avec des valeurs par défaut. Pour personnaliser le SMS et l'expiration, ajouter dans `tracking_config/env.php` :
```php
'rescue_location_share' => [
    'page_path' => '/rescue/location.php',
    'default_expiration_minutes' => 180,
],
'sms' => [
    'rescue_location_share_message_template' => 'TRAIL DPS - {event_name} : position coureur pour intervention {url}',
]
```

## Tests curl
```bash
curl -sS -X POST 'https://tracking.synoluvia.fr/api/rescue/share_location_create.php' \
  -H 'Content-Type: application/json' \
  -H 'X-Api-Key: VOTRE_CLE_API' \
  -d '{"place_instance_id":"PLACE-001","event_remote_id":"EVT-2026-001","runner_request_id":123,"phone":"+33600000000","rescue_team_label":"RESCUE 2"}'

curl -sS 'https://tracking.synoluvia.fr/api/rescue/share_location_status.php?place_instance_id=PLACE-001&event_remote_id=EVT-2026-001' \
  -H 'X-Api-Key: VOTRE_CLE_API'

curl -sS -X POST 'https://tracking.synoluvia.fr/api/rescue/share_location_cancel.php' \
  -H 'Content-Type: application/json' \
  -H 'X-Api-Key: VOTRE_CLE_API' \
  -d '{"place_instance_id":"PLACE-001","event_remote_id":"EVT-2026-001","share_id":1}'
```

## Recette
1. Sauvegarder la base MySQL/MariaDB.
2. Exécuter `sql/lot_4_2_rescue_location_share.sql`.
3. Vérifier l'existence de `rescue_location_share_links` et des colonnes `sms_logs.scope`, `sms_logs.related_share_id`.
4. Utiliser une demande coureur existante avec position reçue.
5. Appeler `share_location_create.php`.
6. Vérifier `SMS_SENT` ou `SMS_ERROR` selon configuration SMS.
7. Ouvrir l'URL retournée et vérifier la page mobile.
8. Vérifier que l'ouverture incrémente `open_count` et passe le statut à `OPENED`.
9. Tester l'annulation et vérifier que la page n'affiche plus la position.

## Non-régression
- Ne pas modifier les pipelines natifs Android/iOS.
- Ne pas modifier `position.php` ni les tables latest/trace.
- Ne pas modifier le système de licence.
- Ne pas créer de bilan médical.
