"""
Moyenne, mediane et mode -- deux scoreurs aux saisons opposees.

Reproduit l'analyse du module 01-moyenne-mediane-mode de bout en bout :
Cooper Flagg (irregulier, ~21 pts mais des cartons a 40+) face a
LeBron James (regulier, ~21 pts colle a sa mediane). On y voit pourquoi
la moyenne et la mediane se separent, et ce que cet ecart raconte.

Donnees : 01-moyenne-mediane-mode__scorers.csv
  colonnes -> player_name, game_date, opp, pts

Usage :
    python script.py                       # cherche le CSV dans /data/ puis a cote du script
    python script.py chemin/vers/scorers.csv
"""

import sys
from pathlib import Path

import pandas as pd
import matplotlib.pyplot as plt

DATASET = "01-moyenne-mediane-mode__scorers.csv"


def trouver_dataset(argv):
    """Resout le chemin du CSV : argument explicite, sinon /data/, sinon dossier du script."""
    if len(argv) > 1:
        return Path(argv[1])
    candidats = [Path("/data") / DATASET, Path(__file__).parent / DATASET, Path(DATASET)]
    for c in candidats:
        if c.exists():
            return c
    return candidats[0]  # laissera pandas lever une erreur claire


def resume(pts, nom):
    """Affiche moyenne, mediane, mode et l'ecart moyenne - mediane."""
    moyenne = pts.sum() / len(pts)          # somme / nombre de matchs
    mediane = pts.sort_values().median()    # la valeur du milieu, une fois trie
    mode = pts.mode().tolist()              # la ou les valeurs les plus frequentes
    print(nom)
    print(f"  matchs  : {len(pts)} (de {pts.min()} a {pts.max()} points)")
    print(f"  moyenne : {moyenne:.1f}")
    print(f"  mediane : {mediane:.0f}")
    print(f"  mode    : {mode}")
    print(f"  ecart moyenne - mediane : {moyenne - mediane:+.1f}")
    print()
    return moyenne, mediane


def robustesse_flagg(pts):
    """Montre que les cartons gonflent la moyenne mais pas la mediane."""
    gros = sorted(pts[pts >= 40].tolist(), reverse=True)
    print("Robustesse (Cooper Flagg)")
    print(f"  matchs a 40+ : {gros} ({len(gros)} sur {len(pts)})")
    print(f"  moyenne complete            : {pts.mean():.1f}")
    print(f"  moyenne sans les matchs 40+ : {pts[pts < 40].mean():.1f}")
    print(f"  mediane complete            : {pts.median():.0f}")
    print(f"  mediane sans les matchs 40+ : {pts[pts < 40].median():.0f}")

    # Experience de pensee : et si le record avait ete a 100 ?
    gonfle = pts.copy()
    gonfle.loc[pts.idxmax()] = 100
    print("  on remplace le record par un improbable 100 points :")
    print(f"    moyenne : {pts.mean():.1f} -> {gonfle.mean():.1f}")
    print(f"    mediane : {pts.median():.0f}   -> {gonfle.median():.0f}")
    print()


def graphique(df, chemin_sortie="moyenne_mediane_mode.png"):
    """Histogrammes des deux saisons avec moyenne (trait plein) et mediane (pointille)."""
    fig, axes = plt.subplots(1, 2, figsize=(12, 4.5), sharex=True, sharey=True)
    bins = range(0, 56, 4)
    for ax, nom, couleur in zip(axes, ["Cooper Flagg", "LeBron James"], ["#C8102E", "#552583"]):
        pts = df[df["player_name"] == nom]["pts"]
        ax.hist(pts, bins=bins, color=couleur, alpha=0.65, edgecolor="white")
        ax.axvline(pts.mean(), color="black", linestyle="-", linewidth=2,
                   label=f"moyenne = {pts.mean():.1f}")
        ax.axvline(pts.median(), color="black", linestyle="--", linewidth=2,
                   label=f"mediane = {pts.median():.0f}")
        ax.set_title(nom)
        ax.set_xlabel("points marques")
        ax.legend()
    axes[0].set_ylabel("nombre de matchs")
    fig.suptitle("Memes ~21 points de moyenne, deux distributions opposees", fontsize=13)
    fig.tight_layout()
    fig.savefig(chemin_sortie, dpi=100)
    print(f"Figure enregistree : {chemin_sortie}")


def main():
    chemin = trouver_dataset(sys.argv)
    df = pd.read_csv(chemin)

    print("=" * 60)
    for nom in ["Cooper Flagg", "LeBron James"]:
        resume(df[df["player_name"] == nom]["pts"], nom)

    print("=" * 60)
    robustesse_flagg(df[df["player_name"] == "Cooper Flagg"]["pts"])

    print("=" * 60)
    graphique(df)


if __name__ == "__main__":
    main()
