"""
Module 01 - Introduction a pandas
Reproduit l'analyse du module : charger une saison de box scores, inspecter le
tableau, detecter les valeurs manquantes et visualiser la distribution des
tentatives a 3 points (en evitant le piege des matchs non joues).

Usage :
    python script.py [chemin/vers/stats_player_games.csv]

Sans argument, le script lit '/data/stats_player_games.csv' (chemin par defaut
dans l'environnement du cours). Dépendances : pandas, matplotlib.
"""

import sys
import pandas as pd
import matplotlib.pyplot as plt

DEFAULT_PATH = "/data/stats_player_games.csv"


def main(csv_path: str) -> None:
    # 1. Charger et regarder
    df = pd.read_csv(csv_path)
    print("lignes, colonnes :", df.shape)
    print(df.head())
    print()

    # 2. Connaitre les types (min est du texte : '25:42')
    print("Colonnes :", df.columns.tolist())
    print(df.dtypes)
    print()

    # 3. Ordres de grandeur (describe ignore les colonnes texte comme min)
    print(df[["min", "pts", "ast", "trb", "fg3a"]].describe().round(1))
    print()

    # 4. Detecter les valeurs manquantes
    manquantes = df.isna().sum()
    print("Valeurs manquantes par colonne :")
    print(manquantes[manquantes > 0])
    total = df["min"].isna().sum()
    print("Colonne min :", total, "valeurs manquantes sur", len(df))
    print("Soit %.1f %% des lignes" % (100 * df["min"].isna().mean()))
    print()

    # 5. Pourquoi ca compte : le piege des matchs non joues
    dnp = df[df["min"].isna()]
    joue = df[df["min"].notna()]
    print("Lignes sans temps de jeu :")
    print("  moyenne de points :", round(dnp["pts"].mean(), 2))
    print("  part a 0 point : %.0f %%" % (100 * (dnp["pts"] == 0).mean()))
    print("Moyenne de tentatives a 3 points :")
    print("  sur tout le fichier          :", round(df["fg3a"].mean(), 2))
    print("  joueurs ayant joue seulement :", round(joue["fg3a"].mean(), 2))
    print()

    # 6. Visualisation : distribution des tentatives a 3 points (joueurs ayant joue)
    fg3a = joue["fg3a"]
    fig, ax = plt.subplots(figsize=(9, 5))
    bins = range(0, fg3a.max() + 2)
    ax.hist(fg3a, bins=bins, color="#1d428a", edgecolor="white", align="left")
    ax.axvline(fg3a.mean(), color="#c8102e", linestyle="--", linewidth=2,
               label="moyenne = %.1f" % fg3a.mean())
    ax.axvline(fg3a.median(), color="#f0a500", linestyle="--", linewidth=2,
               label="mediane = %.0f" % fg3a.median())
    ax.set_title("Tentatives a 3 points par match (joueurs ayant joue)")
    ax.set_xlabel("Tentatives a 3 points sur le match")
    ax.set_ylabel("Nombre de matchs")
    ax.legend()
    fig.tight_layout()
    plt.show()

    print("part de matchs sans tentative a 3 pts : %.1f %%" % (100 * (fg3a == 0).mean()))
    print("part de matchs a 10 tentatives ou plus : %.1f %%" % (100 * (fg3a >= 10).mean()))

    # 7. A toi de jouer : les plus gros volumes a 3 points (min. 20 matchs)
    volume = (joue.groupby("player_name")["fg3a"]
              .agg(matchs="count", moyenne_3pa="mean"))
    volume = volume[volume["matchs"] >= 20]
    print()
    print(volume.sort_values("moyenne_3pa", ascending=False).head(8).round(2))


if __name__ == "__main__":
    path = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_PATH
    main(path)
