import streamlit as st
import pandas as pd
import numpy as np
import unicodedata

st.set_page_config(
    page_title="Effectifs Scolaires 2024 - Par Commune",
    page_icon="🎓",
    layout="wide",
)

DATA_DIR = "/Users/patrickbayeux/Documents/2 - Observatoire/DATA/2026/scolaires/"
APP_DIR  = "/Users/patrickbayeux/Documents/2 - Observatoire/DATA/2026/scolaires/"

# ── Chargement des données ────────────────────────────────────────────────────

def _normalize(s):
    """Normalise un nom de commune : majuscules, sans accents."""
    if pd.isna(s):
        return ""
    s = str(s).upper().strip()
    s = unicodedata.normalize("NFD", s)
    return "".join(c for c in s if unicodedata.category(c) != "Mn")


@st.cache_data(show_spinner="Chargement des données…")
def load_data():
    ecoles  = pd.read_parquet(DATA_DIR + "ecoles_2024.parquet")
    colleges = pd.read_parquet(DATA_DIR + "colleges_2024.parquet")
    lycees  = pd.read_parquet(DATA_DIR + "lycees_2024.parquet")

    if "Code département pays" in lycees.columns and "Code département" not in lycees.columns:
        lycees = lycees.rename(columns={"Code département pays": "Code département"})

    for df in [ecoles, colleges, lycees]:
        df["_commune_norm"] = df["Commune"].str.upper().str.strip()
        df["_dep_code"] = pd.to_numeric(df["Code département"], errors="coerce").astype("Int64")

    return ecoles, colleges, lycees


@st.cache_data(show_spinner=False)
def load_communes():
    """Charge le référentiel communes-france-2025 et renvoie un DataFrame nettoyé."""
    df = pd.read_excel(APP_DIR + "communes-france-2025.xlsx", header=1)
    df = df[["code_insee", "nom_standard", "dep_code", "dep_nom", "epci_nom", "population"]].copy()
    df["nom_norm"]  = df["nom_standard"].apply(_normalize)
    df["dep_code"]  = pd.to_numeric(df["dep_code"], errors="coerce").astype("Int64")
    df["population"] = pd.to_numeric(df["population"], errors="coerce").fillna(0).astype(int)
    return df


@st.cache_data(show_spinner=False)
def build_commune_list(_ecoles, _colleges, _lycees, _communes_ref):
    """Construit la liste unifiée des communes présentes dans au moins un fichier."""
    def extract(df):
        return df[["Département", "_commune_norm", "Commune", "_dep_code"]].drop_duplicates()

    all_c = pd.concat([extract(_ecoles), extract(_colleges), extract(_lycees)]).drop_duplicates()

    # Joindre avec le référentiel communes pour population et EPCI
    all_c = all_c.merge(
        _communes_ref[["nom_norm", "dep_code", "epci_nom", "population"]],
        left_on=["_commune_norm", "_dep_code"],
        right_on=["nom_norm", "dep_code"],
        how="left",
    )
    pop_str = all_c["population"].apply(
        lambda p: f"  {int(p):,} hab.".replace(",", "\u202f") if pd.notna(p) and int(p) > 0 else ""
    )
    all_c["label"] = all_c["Commune"].str.title() + "  (" + all_c["Département"] + ")" + pop_str
    return all_c.sort_values("label").reset_index(drop=True)


@st.cache_data(show_spinner=False)
def build_epci_list(_communes_ref, _ecoles, _colleges, _lycees):
    """Construit la liste des EPCI représentés dans les données scolaires."""
    # Tous les (dep_code, commune_norm) présents dans les données scolaires
    all_school = pd.concat([
        _ecoles[["_dep_code", "_commune_norm"]],
        _colleges[["_dep_code", "_commune_norm"]],
        _lycees[["_dep_code", "_commune_norm"]],
    ]).drop_duplicates()

    merged = all_school.merge(
        _communes_ref[["nom_norm", "dep_code", "epci_nom", "population"]],
        left_on=["_commune_norm", "_dep_code"],
        right_on=["nom_norm", "dep_code"],
        how="left",
    )
    merged = merged[merged["epci_nom"].notna() & (merged["epci_nom"] != "")]
    epci_pop = (
        _communes_ref[_communes_ref["epci_nom"].notna()]
        .groupby("epci_nom")["population"]
        .sum()
        .reset_index()
        .rename(columns={"population": "pop_epci"})
    )
    epci_list = (
        merged[["epci_nom"]].drop_duplicates()
        .merge(epci_pop, on="epci_nom", how="left")
        .sort_values("epci_nom")
    )
    return epci_list


ecoles, colleges, lycees = load_data()
communes_ref   = load_communes()
communes_df    = build_commune_list(ecoles, colleges, lycees, communes_ref)
epci_df        = build_epci_list(communes_ref, ecoles, colleges, lycees)

# ── Interface ─────────────────────────────────────────────────────────────────

st.title("🎓 Effectifs scolaires 2024 — par commune ou intercommunalité")
st.caption("Source : Ministère de l'Éducation nationale · Rentrée scolaire 2024")

mode = st.radio(
    "Rechercher par :",
    ["🏘️ Commune", "🏛️ Intercommunalité (EPCI)"],
    horizontal=True,
)

selected_label = None
selected_epci  = None
pop_affichee   = None
commune_slug   = "commune"

if mode == "🏘️ Commune":
    labels = ["— Sélectionner une commune —"] + communes_df["label"].tolist()
    selected_label = st.selectbox(
        "Rechercher une commune",
        options=labels,
        help="Tapez les premières lettres pour filtrer la liste",
    )

    if selected_label == "— Sélectionner une commune —":
        st.info("Sélectionnez une commune dans la liste pour afficher ses effectifs scolaires 2024.", icon="👆")
        st.stop()

    row = communes_df[communes_df["label"] == selected_label].iloc[0]
    dept         = row["Département"]
    commune_norm = row["_commune_norm"]
    pop_commune  = int(row["population"]) if pd.notna(row.get("population")) and row.get("population") else 0
    commune_slug = row["Commune"].replace(" ", "_").replace("/", "-")

    ec = ecoles[(ecoles["_commune_norm"] == commune_norm) & (ecoles["Département"] == dept)]
    co = colleges[(colleges["_commune_norm"] == commune_norm) & (colleges["Département"] == dept)]
    ly = lycees[(lycees["_commune_norm"] == commune_norm) & (lycees["Département"] == dept)]

    titre_zone = row["Commune"].title() + f"  ({dept})"
    pop_affichee = pop_commune

else:  # EPCI
    epci_options = ["— Sélectionner une intercommunalité —"] + epci_df["epci_nom"].tolist()
    selected_epci = st.selectbox(
        "Rechercher une intercommunalité (EPCI)",
        options=epci_options,
        help="Tapez les premières lettres pour filtrer la liste",
    )

    if selected_epci == "— Sélectionner une intercommunalité —":
        st.info("Sélectionnez une intercommunalité dans la liste pour afficher ses effectifs scolaires 2024.", icon="👆")
        st.stop()

    # Communes de cet EPCI connues du référentiel
    comm_epci = communes_ref[communes_ref["epci_nom"] == selected_epci][["nom_norm", "dep_code", "population"]].copy()
    pop_affichee = int(comm_epci["population"].sum())
    commune_slug = selected_epci.replace(" ", "_").replace("/", "-")

    # Filtrer les données scolaires : toutes les communes de l'EPCI
    def filter_epci(df):
        merged = df.merge(
            comm_epci[["nom_norm", "dep_code"]],
            left_on=["_commune_norm", "_dep_code"],
            right_on=["nom_norm", "dep_code"],
            how="inner",
        )
        return merged.drop(columns=["nom_norm", "dep_code"], errors="ignore")

    ec = filter_epci(ecoles)
    co = filter_epci(colleges)
    ly = filter_epci(lycees)
    titre_zone = selected_epci

st.divider()

# Population
if pop_affichee and pop_affichee > 0:
    label_pop = "Population commune" if mode == "🏘️ Commune" else "Population intercommunalité"
    st.metric(label_pop, f"{pop_affichee:,}".replace(",", "\u202f") + " habitants")

# ── Résumé en métriques ───────────────────────────────────────────────────────

def safe_int(val):
    try:
        return int(val) if not pd.isna(val) else 0
    except Exception:
        return 0


col_ec, col_co, col_ly = st.columns(3)

with col_ec:
    st.subheader("🏫 Écoles élémentaires")
    nb = len(ec)
    total = safe_int(ec["Nombre total d'élèves"].sum())
    maternelle = safe_int(ec["Nombre d'élèves en pré-élémentaire hors ULIS"].sum())
    primaire   = safe_int(ec["Nombre d'élèves en élémentaire hors ULIS"].sum())
    ulis_ec    = safe_int(ec["Nombre d'élèves en ULIS"].sum())
    if nb == 0:
        st.warning("Aucune école enregistrée dans cette zone.")
    else:
        m1, m2 = st.columns(2)
        m1.metric("Nombre d'écoles", nb)
        m2.metric("Total élèves", total)
        st.markdown(
            f"""
| Niveau | Élèves |
|--------|-------:|
| Maternelle (pré-élémentaire) | {maternelle:,} |
| Primaire (élémentaire) | {primaire:,} |
| ULIS | {ulis_ec:,} |
| **Total** | **{total:,}** |
"""
        )

with col_co:
    st.subheader("🏛️ Collèges")
    nb    = len(co)
    total = safe_int(co["nombre_eleves_total"].sum())
    n6 = safe_int(co["6èmes total"].sum())
    n5 = safe_int(co["5èmes total"].sum())
    n4 = safe_int(co["4èmes total"].sum())
    n3 = safe_int(co["3èmes total"].sum())
    if nb == 0:
        st.warning("Aucun collège enregistré dans cette zone.")
    else:
        m1, m2 = st.columns(2)
        m1.metric("Nombre de collèges", nb)
        m2.metric("Total élèves", total)
        st.markdown(
            f"""
| Niveau | Élèves |
|--------|-------:|
| 6ème | {n6:,} |
| 5ème | {n5:,} |
| 4ème | {n4:,} |
| 3ème | {n3:,} |
| **Total** | **{total:,}** |
"""
        )

with col_ly:
    st.subheader("🎓 Lycées (GT)")
    nb    = len(ly)
    total = safe_int(ly["Nombre d'élèves"].sum())

    secondes = safe_int(ly["2ndes GT"].sum())

    premieres_cols  = [c for c in ly.columns if c.startswith("1ères ") and
                       not any(x in c for x in ["filles", "garçons", "LV1", "LV2"])]
    terminales_cols = [c for c in ly.columns if c.startswith("Terminales ") and
                       not any(x in c for x in ["filles", "garçons", "LV1", "LV2"])]
    premieres  = safe_int(sum(ly[c].fillna(0).sum() for c in premieres_cols))
    terminales = safe_int(sum(ly[c].fillna(0).sum() for c in terminales_cols))

    if nb == 0:
        st.warning("Aucun lycée (GT) enregistré dans cette zone.")
    else:
        m1, m2 = st.columns(2)
        m1.metric("Nombre de lycées", nb)
        m2.metric("Total élèves", total)
        st.markdown(
            f"""
| Niveau | Élèves |
|--------|-------:|
| 2nde GT | {secondes:,} |
| 1ère | {premieres:,} |
| Terminale | {terminales:,} |
| **Total** | **{total:,}** |
"""
        )

# ── Total général ─────────────────────────────────────────────────────────────

total_general = (
    safe_int(ec["Nombre total d'élèves"].sum())
    + safe_int(co["nombre_eleves_total"].sum())
    + safe_int(ly["Nombre d'élèves"].sum())
)
if total_general > 0:
    st.markdown(
        f"<div style='text-align:right; font-size:1.1em; color:#555;'>"
        f"📊 Total zone (tous niveaux) : <strong>{total_general:,} élèves</strong></div>",
        unsafe_allow_html=True,
    )

st.divider()

# ── Tableaux détaillés ────────────────────────────────────────────────────────

tab1, tab2, tab3 = st.tabs(["🏫 Détail Écoles", "🏛️ Détail Collèges", "🎓 Détail Lycées"])

with tab1:
    if ec.empty:
        st.info("Aucune école dans cette zone.")
    else:
        cols_show = [
            "Commune", "Dénomination principale", "Patronyme", "Secteur", "REP", "REP +",
            "Nombre total de classes", "Nombre total d'élèves",
            "Nombre d'élèves en pré-élémentaire hors ULIS",
            "Nombre d'élèves en élémentaire hors ULIS",
            "Nombre d'élèves en ULIS",
            "Nombre d'élèves en CP hors ULIS",
            "Nombre d'élèves en CE1 hors ULIS",
            "Nombre d'élèves en CE2 hors ULIS",
            "Nombre d'élèves en CM1 hors ULIS",
            "Nombre d'élèves en CM2 hors ULIS",
        ]
        cols_show = [c for c in cols_show if c in ec.columns]
        rename_ec = {
            "Dénomination principale": "Type",
            "Patronyme": "Nom",
            "Nombre total de classes": "Classes",
            "Nombre total d'élèves": "Total élèves",
            "Nombre d'élèves en pré-élémentaire hors ULIS": "Maternelle",
            "Nombre d'élèves en élémentaire hors ULIS": "Primaire",
            "Nombre d'élèves en ULIS": "ULIS",
            "Nombre d'élèves en CP hors ULIS": "CP",
            "Nombre d'élèves en CE1 hors ULIS": "CE1",
            "Nombre d'élèves en CE2 hors ULIS": "CE2",
            "Nombre d'élèves en CM1 hors ULIS": "CM1",
            "Nombre d'élèves en CM2 hors ULIS": "CM2",
        }
        st.dataframe(ec[cols_show].rename(columns=rename_ec).reset_index(drop=True), use_container_width=True)

with tab2:
    if co.empty:
        st.info("Aucun collège dans cette zone.")
    else:
        cols_show = [
            "Commune", "Dénomination principale", "Patronyme", "Secteur", "REP", "REP +",
            "nombre_eleves_total",
            "6èmes total", "5èmes total", "4èmes total", "3èmes total",
            "Nombre d'élèves total Segpa", "Nombre d'élèves total ULIS",
        ]
        cols_show = [c for c in cols_show if c in co.columns]
        rename_co = {
            "Dénomination principale": "Type",
            "Patronyme": "Nom",
            "nombre_eleves_total": "Total élèves",
            "6èmes total": "6ème",
            "5èmes total": "5ème",
            "4èmes total": "4ème",
            "3èmes total": "3ème",
            "Nombre d'élèves total Segpa": "Segpa",
            "Nombre d'élèves total ULIS": "ULIS",
        }
        st.dataframe(co[cols_show].rename(columns=rename_co).reset_index(drop=True), use_container_width=True)

with tab3:
    if ly.empty:
        st.info("Aucun lycée (GT) dans cette zone.")
    else:
        cols_show = [
            "Commune", "Dénomination principale", "Patronyme", "Secteur",
            "Nombre d'élèves", "2ndes GT",
            "1ères G", "1ères STI2D", "1ères STL", "1ères STMG", "1ères ST2S", "1ères STD2A",
            "Terminales G", "Terminales STI2D", "Terminales STL",
            "Terminales STMG", "Terminales ST2S", "Terminales STD2A",
        ]
        cols_show = [c for c in cols_show if c in ly.columns]
        rename_ly = {
            "Dénomination principale": "Type",
            "Patronyme": "Nom",
            "Nombre d'élèves": "Total élèves",
        }
        st.dataframe(ly[cols_show].rename(columns=rename_ly).reset_index(drop=True), use_container_width=True)

# ── Module besoins en équipements sportifs ────────────────────────────────────

st.divider()
st.header("⚽ Besoins théoriques en équipements sportifs couverts")
st.caption(
    "Modèle basé sur les ratios EPS du Ministère de l'Éducation nationale · "
    "Structure de référence : gymnase / salle multisports"
)

# CSS : cases jaunes sur les number_input
st.markdown(
    """
    <style>
    div[data-testid="stNumberInput"] input {
        background-color: #FFFDE7 !important;
        border: 2px solid #F9A825 !important;
        border-radius: 4px !important;
    }
    div[data-testid="stNumberInput"] label {
        font-weight: 600;
    }
    </style>
    """,
    unsafe_allow_html=True,
)

st.markdown(
    "<div style='background:#FFFDE7; border:2px solid #F9A825; border-radius:8px; "
    "padding:10px 18px; margin-bottom:14px; font-size:0.95em;'>"
    "🟡 <b>Renseignez les 4 effectifs ci-dessous</b> — pré-remplis depuis les données 2024 "
    "de la zone sélectionnée, modifiables à volonté.</div>",
    unsafe_allow_html=True,
)

# Valeurs par défaut issues des données de la zone
def_mat  = safe_int(ec["Nombre d'élèves en pré-élémentaire hors ULIS"].sum())
def_prim = safe_int(ec["Nombre d'élèves en élémentaire hors ULIS"].sum())
def_col  = safe_int(co["nombre_eleves_total"].sum())
def_lyc  = safe_int(ly["Nombre d'élèves"].sum())

# Clé dynamique : change à chaque nouvelle sélection → widget recréé avec la bonne valeur par défaut
_sel_key = commune_slug

c1, c2, c3, c4 = st.columns(4)
with c1:
    eff_mat  = st.number_input("🟡 Maternelle",  min_value=0, value=def_mat,  step=1, key=f"bs_mat_{_sel_key}")
with c2:
    eff_prim = st.number_input("🟡 Primaire",    min_value=0, value=def_prim, step=1, key=f"bs_prim_{_sel_key}")
with c3:
    eff_col  = st.number_input("🟡 Collèges",    min_value=0, value=def_col,  step=1, key=f"bs_col_{_sel_key}")
with c4:
    eff_lyc  = st.number_input("🟡 Lycées",      min_value=0, value=def_lyc,  step=1, key=f"bs_lyc_{_sel_key}")

# ── Calculs ───────────────────────────────────────────────────────────────────
#
# Valeurs m²/élève (plan d'eau) — source : besoins théoriques scolaires (version finale) :
#   Maternelle : 0.0174   Primaire : 0.0462   Collège : 0.0450   Lycée : 0.0119

HYP1, HYP2 = 0.30, 0.50

# (niveau, effectif, moy_classe, h_eps, h_prog, inclus_dans_total)
NIVEAUX = [
    ("Maternelle", eff_mat,  20, 3, 24, False),
    ("Primaire",   eff_prim, 22, 3, 27, True),
    ("Collège",    eff_col,  25, 4, 36, True),
    ("Lycée",      eff_lyc,  28, 3, 40, True),
]

total_eff = eff_mat + eff_prim + eff_col + eff_lyc

table_rows = []
k9, m9 = 0.0, 0.0
for niveau, eff, moy, h_eps, h_prog, in_total in NIVEAUX:
    pct    = eff / total_eff * 100 if total_eff > 0 else 0
    nb_cls = eff / moy if moy > 0 else 0
    g_val  = h_eps * HYP1
    h_val  = h_eps * HYP2
    j_val  = h_prog / g_val if g_val > 0 else 0
    l_val  = h_prog / h_val if h_val > 0 else 0
    k_val  = nb_cls / j_val if j_val > 0 else 0
    m_val  = nb_cls / l_val if l_val > 0 else 0
    if in_total:
        k9 += k_val
        m9 += m_val
    table_rows.append({
        "Niveau":                  niveau,
        "Effectifs":               eff,
        "% total":                 f"{pct:.1f} %",
        "Moy. / classe":           moy,
        "Nb classes":              round(nb_cls, 1),
        "H. EPS / sem.":           h_eps,
        "H. prog. / sem.":         h_prog,
        "Cl. / struct. (30%)":     round(j_val, 1),
        "Besoin gymnase (30%)":    round(k_val, 2),
        "Cl. / struct. (50%)":     round(l_val, 1),
        "Besoin gymnase (50%)":    round(m_val, 2),
    })

# Ligne total
table_rows.append({
    "Niveau":                  "**Total**",
    "Effectifs":               total_eff,
    "% total":                 "100.0 %",
    "Moy. / classe":           "—",
    "Nb classes":              "—",
    "H. EPS / sem.":           "—",
    "H. prog. / sem.":         "—",
    "Cl. / struct. (30%)":     "—",
    "Besoin gymnase (30%)":    "—",
    "Cl. / struct. (50%)":     "—",
    "Besoin gymnase (50%)":    "—",
})

# ── Calcul m² plan d'eau — 3 hypothèses (formules : besoins théoriques scolaires.xlsx) ──
# Préélémentaire
B30 = eff_mat * 0 * (1/3) * 5/16                              # hyp basse C4=0
E30 = eff_mat * (1/3) * (1/3) * 5/16                          # hyp haute
# Élémentaire
C33 = eff_prim * (2/5) * (1/3) * (2/3) * 5/20                 # non nageur, hyp basse
D34 = eff_prim * (2/5) * (1/3) * (1/3) * 6/20                 # nageur, hyp basse
F33 = eff_prim * (4/5) * (1/3) * (2/3) * 5/25                 # non nageur, hyp haute
G34 = eff_prim * (4/5) * (1/3) * (1/3) * 6/25                 # nageur, hyp haute
# Collège
C37 = eff_col * (1/4) * (1/3) * (1/4) * 6/25                  # non nageur, hyp basse
D38 = eff_col * (1/4) * (1/3) * (3/4) * 7/25                  # nageur, hyp basse
F37 = eff_col * (1/2) * (1/2) * (1/4) * 6/25                  # non nageur, hyp haute
G38 = eff_col * (1/2) * (1/2) * (3/4) * 7/25                  # nageur, hyp haute
# Lycée
D40 = eff_lyc * (1/9) * (1/3) * 1 * 8/25
# Totaux (C44, F44, I44) puis majoration 20 %
C44 = B30 + C33 + C37 + D34 + D38 + D40
F44 = E30 + F33 + F37 + G34 + G38 + D40
I44 = (C44 + F44) / 2
m2_hyp_basse  = C44 * 1.2
m2_hyp_haute  = F44 * 1.2
m2_hyp_moy    = I44 * 1.2

st.markdown("<br>", unsafe_allow_html=True)
st.dataframe(pd.DataFrame(table_rows), use_container_width=True, hide_index=True)

# ── Résultats verts ───────────────────────────────────────────────────────────

st.markdown("<br>", unsafe_allow_html=True)
cg1, cg2 = st.columns(2)

with cg1:
    st.markdown(
        f"""<div style="background:#00B050; color:white; border-radius:12px;
        padding:28px 24px; text-align:center; box-shadow:0 3px 10px rgba(0,0,0,0.18);">
        <div style="font-size:1.05em; font-weight:700; letter-spacing:.3px;">
            🟢 BESOIN THÉORIQUE — hypothèse 30 %
        </div>
        <div style="font-size:0.88em; opacity:.85; margin:6px 0 14px 0;">
            1 classe occupe 30 % du planning hebdomadaire d'une structure
        </div>
        <div style="font-size:3.8em; font-weight:800; line-height:1.1;">{k9:.2f}</div>
        <div style="font-size:1.05em; margin-top:8px; opacity:.9;">
            gymnases / salles multisports
        </div>
        </div>""",
        unsafe_allow_html=True,
    )

with cg2:
    st.markdown(
        f"""<div style="background:#00B050; color:white; border-radius:12px;
        padding:28px 24px; text-align:center; box-shadow:0 3px 10px rgba(0,0,0,0.18);">
        <div style="font-size:1.05em; font-weight:700; letter-spacing:.3px;">
            🟢 BESOIN THÉORIQUE — hypothèse 50 %
        </div>
        <div style="font-size:0.88em; opacity:.85; margin:6px 0 14px 0;">
            1 classe occupe 50 % du planning hebdomadaire d'une structure
        </div>
        <div style="font-size:3.8em; font-weight:800; line-height:1.1;">{m9:.2f}</div>
        <div style="font-size:1.05em; margin-top:8px; opacity:.9;">
            gymnases / salles multisports
        </div>
        </div>""",
        unsafe_allow_html=True,
    )

# ── Résultats bleus : besoin m² plan d'eau — 3 hypothèses ───────────────────

st.markdown("<br>", unsafe_allow_html=True)
cb1, cb2, cb3 = st.columns(3)

_blue_css = (
    "border-radius:12px; padding:22px 16px; text-align:center; "
    "box-shadow:0 3px 10px rgba(0,0,0,0.18); color:white;"
)

with cb1:
    st.markdown(
        f"""<div style="background:#1565C0; {_blue_css}">
        <div style="font-size:0.95em; font-weight:700; letter-spacing:.3px;">
            🔵 HYPOTHÈSE BASSE
        </div>
        <div style="font-size:0.78em; opacity:.85; margin:5px 0 12px 0;">
            Fréquentation réduite &amp; cycles courts
        </div>
        <div style="font-size:3.2em; font-weight:800; line-height:1.1;">{m2_hyp_basse:,.0f} m²</div>
        <div style="font-size:0.9em; margin-top:7px; opacity:.9;">de plan d'eau</div>
        </div>""",
        unsafe_allow_html=True,
    )

with cb2:
    st.markdown(
        f"""<div style="background:#0D47A1; {_blue_css}">
        <div style="font-size:0.95em; font-weight:700; letter-spacing:.3px;">
            🔵 HYPOTHÈSE HAUTE
        </div>
        <div style="font-size:0.78em; opacity:.85; margin:5px 0 12px 0;">
            Fréquentation élevée &amp; cycles longs
        </div>
        <div style="font-size:3.2em; font-weight:800; line-height:1.1;">{m2_hyp_haute:,.0f} m²</div>
        <div style="font-size:0.9em; margin-top:7px; opacity:.9;">de plan d'eau</div>
        </div>""",
        unsafe_allow_html=True,
    )

with cb3:
    st.markdown(
        f"""<div style="background:#1976D2; {_blue_css}">
        <div style="font-size:0.95em; font-weight:700; letter-spacing:.3px;">
            🔵 HYPOTHÈSE MOYENNE
        </div>
        <div style="font-size:0.78em; opacity:.85; margin:5px 0 12px 0;">
            Moyenne hypothèses basse / haute
        </div>
        <div style="font-size:3.2em; font-weight:800; line-height:1.1;">{m2_hyp_moy:,.0f} m²</div>
        <div style="font-size:0.9em; margin-top:7px; opacity:.9;">de plan d'eau</div>
        </div>""",
        unsafe_allow_html=True,
    )

st.markdown(
    "<p style='font-size:0.8em; color:#888; margin-top:10px;'>"
    "⚠️ Les totaux gymnase excluent la maternelle (conformément au modèle de référence). "
    "Paramètres fixes gymnase : maternelle 20 él./cl. · primaire 22 · collège 25 · lycée 28 — "
    "EPS : 3h/sem. (mat./prim./lyc.) et 4h/sem. (collège). "
    "Besoins piscine calculés selon le modèle « besoins théoriques scolaires.xlsx » "
    "(onglet besoins scolaires piscines, cellules C46 / F46 / I46) — majoration 20 % incluse.</p>",
    unsafe_allow_html=True,
)

# ── Export CSV ────────────────────────────────────────────────────────────────

st.divider()
st.subheader("📥 Exporter les données")
exp1, exp2, exp3 = st.columns(3)


def to_csv(df, cols):
    available = [c for c in cols if c in df.columns]
    return df[available].to_csv(index=False, sep=";", encoding="utf-8-sig").encode("utf-8-sig")


with exp1:
    if not ec.empty:
        st.download_button(
            "⬇️ Écoles (CSV)",
            data=to_csv(ec, [
                "Commune", "Dénomination principale", "Patronyme", "Secteur", "Code Postal",
                "Nombre total de classes", "Nombre total d'élèves",
                "Nombre d'élèves en pré-élémentaire hors ULIS",
                "Nombre d'élèves en élémentaire hors ULIS",
                "Nombre d'élèves en ULIS",
            ]),
            file_name=f"ecoles_2024_{commune_slug}.csv",
            mime="text/csv",
        )

with exp2:
    if not co.empty:
        st.download_button(
            "⬇️ Collèges (CSV)",
            data=to_csv(co, [
                "Commune", "Dénomination principale", "Patronyme", "Secteur", "Code commune",
                "nombre_eleves_total", "6èmes total", "5èmes total", "4èmes total", "3èmes total",
                "Nombre d'élèves total Segpa", "Nombre d'élèves total ULIS",
            ]),
            file_name=f"colleges_2024_{commune_slug}.csv",
            mime="text/csv",
        )

with exp3:
    if not ly.empty:
        st.download_button(
            "⬇️ Lycées (CSV)",
            data=to_csv(ly, [
                "Commune", "Dénomination principale", "Patronyme", "Secteur", "Code commune",
                "Nombre d'élèves", "2ndes GT",
                "1ères G", "1ères STI2D", "1ères STL", "1ères STMG", "1ères ST2S",
                "Terminales G", "Terminales STI2D", "Terminales STL", "Terminales STMG", "Terminales ST2S",
            ]),
            file_name=f"lycees_2024_{commune_slug}.csv",
            mime="text/csv",
        )
