# POC Eau - Mieux utiliser la ressource Eau

Prototype Flask + Leaflet + Chart.js sur le périmètre AULA (CA de
Béthune-Bruay Artois-Lys Romane, CC du Ternois, CC des Sept Vallées) :

- rétrospective : évolution des prélèvements, arrêtés CATNAT inondation ;
- état des lieux : volumes prélevés, provenance de l'eau, captages,
  qualité des eaux souterraines et des cours d'eau, stations
  d'épuration, facture d'eau des ménages ;
- anticiper : population et habitations en zone PPRi ;
- trajectoire : projections de population et de consommation d'eau,
  économies d'eau attendues, évolution du prix de l'eau.

Structure de projet alignée sur celle du [POC foncier](../poc-foncier)
(voir `docs/STRUCTURE.md` pour le détail des correspondances).

## Lancer en local

```bash
cd poc-eau
python -m venv .venv
. .venv/bin/activate        # Windows : .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env        # puis renseigner les infos de connexion PostGIS
python app.py
```

Puis ouvrir :

```text
http://127.0.0.1:5000
```

Vérifier que `.env` est bien pris en compte et que la connexion PostGIS
fonctionne :

```bash
python scripts/check_env.py
```

## Configuration (`.env`)

Voir `.env.example` pour le détail. Les variables clés :

```text
PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD, PGSSLMODE
    -> connexion PostgreSQL/PostGIS (mêmes noms que le POC foncier)

EAU_SCHEMA
    -> schéma contenant les tables eau_poc.* (par défaut : eau_poc)

EAU_EPCI_SCOPE
    -> périmètre AULA pris en compte par défaut, séparé par "|"
       (et non "," car un nom d'EPCI contient déjà une virgule)

EAU_ANNEE_PRELEVEMENTS, EAU_ANNEE_PRIX
    -> millésimes de référence affichés dans le bloc "état des lieux"
```

## Base de données

Cette V1 lit directement les tables `eau_poc.*` existantes (contrairement
au POC foncier qui s'appuie sur des vues) : voir `docs/DONNEES.md` pour
le contrat de données complet (tables et colonnes attendues).

### Faut-il créer des vues ?

**Non, ce n'est pas nécessaire pour que l'application fonctionne** : le
code interroge directement les tables existantes. Deux scripts SQL sont
fournis en complément, à exécuter dans pgAdmin ou psql :

```text
sql/01_indexes.sql
    Index recommandés (GiST sur les colonnes geom, B-tree sur nom_epci
    / année). Aucune de ces colonnes n'est indexée aujourd'hui alors
    qu'elles sont filtrées dans quasiment toutes les requêtes : à
    exécuter en priorité si les cartes ou les graphiques sont lents.
    Script additif (CREATE INDEX IF NOT EXISTS), sans risque à rejouer.

sql/00_perimetre_epci_optionnel.sql
    Optionnel. Crée une table eau_poc.perimetre_epci qui documente le
    périmètre AULA côté base (utile si d'autres outils SQL/QGIS doivent
    connaître ce périmètre). Le code Python ne lit PAS cette table : le
    périmètre effectif reste piloté par EAU_EPCI_SCOPE dans .env.
```

## Endpoints principaux

```text
GET /
GET /api/health

GET /api/territoires/epci
GET /api/territoires/communes?epci=...

GET /api/indicateurs/volumes-preleves?epci=...&communes=...
GET /api/indicateurs/provenance-eau
GET /api/indicateurs/captages-carte
GET /api/indicateurs/captages-abandonnes
GET /api/indicateurs/qualite-eau-souterraine
GET /api/indicateurs/qualite-eco-carte
GET /api/indicateurs/step-carte
GET /api/indicateurs/step-chiffres-cles
GET /api/indicateurs/evolution-prelevements
GET /api/indicateurs/evolution-catnat-inondation
GET /api/indicateurs/nombre-catnat-inondation
GET /api/indicateurs/population-ppri
GET /api/indicateurs/habitations-ppri
GET /api/indicateurs/projection-population
GET /api/indicateurs/projection-conso-eau
GET /api/indicateurs/economie-eau
GET /api/indicateurs/prix-evolution
GET /api/indicateurs/prix-repartition
```

Tous les endpoints `indicateurs` acceptent en query params :

```text
epci=<nom exact de l'EPCI>
communes=<nom de commune>   (répétable : ?communes=A&communes=B)
```

## Organisation des fichiers

```text
poc-eau/
  app.py                 point d'entrée Flask
  config.py               configuration centralisée (.env)
  requirements.txt
  .env.example
  README.md

  routes/                 endpoints Flask (blueprints)
    territoires.py
    indicateurs.py

  services/                accès base de données
    db.py                  connexion + filtre de périmètre partagé
    territoires.py
    etat.py
    retrospective.py
    trajectoire.py
    anticiper.py

  data/
    scope.json             périmètre AULA de référence (documentaire)
    cache/                 réservé à un futur cache de données externes

  docs/
    DONNEES.md              contrat de données (tables/colonnes attendues)
    STRUCTURE.md             correspondance avec le POC foncier

  scripts/
    check_env.py             diagnostic .env / connexion PostGIS

  sql/
    00_perimetre_epci_optionnel.sql
    01_indexes.sql

  static/
    css/style.css
    js/                      (inchangé : core/ + indicators/)
    images/

  templates/
    base.html
    dashboard.html
```

## Interface (alignée sur le POC foncier)

- **Page continue** : les 4 chapitres (Rétrospective, État des lieux,
  Anticiper, Trajectoire) sont tous affichés sur une seule page,
  l'ancien système de sections en plein écran avec points de
  navigation et transition en vague a été retiré.
- **Boutons chapitres dans l'entête** : remplacent les anciens points
  cliquables ; cliquer sur un chapitre fait défiler la page jusqu'à la
  section correspondante (`static/js/script.js::bindChapterButtons`).
- **Filtre de périmètre à deux boutons** (`EPCI` / `Commune`) sous
  l'entête, exactement comme dans le POC foncier : le bouton actif
  détermine la liste proposée dans le sélecteur du haut. Par rapport à
  l'ancien filtre (un EPCI + plusieurs communes combinables via des
  tags), ce nouveau filtre est volontairement plus simple : un seul
  territoire à la fois (un EPCI **ou** une commune), sélectionné dans
  un unique menu déroulant qui se met à jour automatiquement.
- **Couleurs et police du contenu** : mêmes tokens que le POC foncier
  (`static/css/style.css`), header bleu nuit conservé à l'identique.

## Corrections apportées lors de la réorganisation

- **Bug corrigé** : dans `captages_carte_data` (`services/etat.py`),
  la requête `query_stats` recevait des paramètres de filtre EPCI/communes
  sans que le SQL ne contienne les `%s` correspondants. Un filtre
  EPCI/commune sur la carte des captages provoquait donc une erreur
  psycopg2 (`the query does not contain any placeholder`). Corrigé.
- **Périmètre AULA** : sorti du code (recopié dans ~15 requêtes) vers
  `.env` (`EAU_EPCI_SCOPE`), lu une seule fois par `config.py`.
- **Nom du schéma** : `eau_poc` était codé en dur dans chaque requête,
  il est maintenant piloté par `EAU_SCHEMA`.
- **Millésimes** : `2023` (prélèvements) et `'2024'` (prix) étaient codés
  en dur, ils sont maintenant `EAU_ANNEE_PRELEVEMENTS` /
  `EAU_ANNEE_PRIX`.
