# scripts/plot_rain_event_composites.py
from __future__ import annotations

from pathlib import Path
from typing import Sequence

import pandas as pd

from meteo.dataset import load_raw_csv
from meteo.variables import Variable, VARIABLES_BY_KEY
from meteo.analysis import detect_threshold_events, build_event_aligned_segments
from meteo.plots import plot_event_composite


CSV_PATH = Path("data/weather_minutely.csv")
OUTPUT_PATH = Path("figures/event_composites/rain_event_composites.png")

RAIN_THRESHOLD = 0.2      # mm/h : au-dessous on considère qu'il ne pleut pas vraiment
MIN_EVENT_DURATION = 5    # minutes
MIN_EVENT_GAP = 20        # minutes nécessaires pour considérer un nouvel événement
WINDOW_BEFORE = 120       # minutes affichées avant le début de la pluie
WINDOW_AFTER = 240        # minutes après le déclenchement

COMPOSITE_VARIABLE_KEYS: Sequence[str] = [
    "pressure",
    "temperature",
    "humidity",
    "wind_speed",
]


def main() -> None:
    if not CSV_PATH.exists():
        print(f"⚠ Fichier introuvable : {CSV_PATH}")
        return

    df = load_raw_csv(CSV_PATH)
    print(f"Dataset minuté chargé : {CSV_PATH}")
    print(f"  Lignes   : {len(df)}")
    print(f"  Colonnes : {list(df.columns)}")
    print()

    rain_series = df["rain_rate"]
    events = detect_threshold_events(
        rain_series,
        threshold=RAIN_THRESHOLD,
        min_duration=pd.Timedelta(minutes=MIN_EVENT_DURATION),
        min_gap=pd.Timedelta(minutes=MIN_EVENT_GAP),
    )

    if not events:
        print("⚠ Aucun événement de pluie détecté avec les paramètres actuels.")
        return

    print(f"Nombre d'événements détectés : {len(events)}")

    variables: list[Variable] = [VARIABLES_BY_KEY[key] for key in COMPOSITE_VARIABLE_KEYS]
    columns = [v.column for v in variables]

    aligned_segments = build_event_aligned_segments(
        df=df,
        events=events,
        columns=columns,
        window_before_minutes=WINDOW_BEFORE,
        window_after_minutes=WINDOW_AFTER,
        resample_minutes=1,
    )

    if aligned_segments.empty:
        print("⚠ Les segments alignés sont vides (période manquante ?).")
        return

    output_path = plot_event_composite(
        aligned_segments=aligned_segments,
        variables=variables,
        output_path=OUTPUT_PATH,
        quantiles=(0.2, 0.8),
        baseline_label="Début de la pluie",
    )

    print(f"✔ Graphique composite pluie sauvegardé : {output_path}")


if __name__ == "__main__":
    main()
