import os
import csv
import numpy as np
import matplotlib.pyplot as plt

def graph_multi_csv(chemins_csv, chemin_sortie="."):
    """
    Prend une liste de fichiers CSV (chacun avec colonnes: k + ratio_x)
    et trace tous les ratios sur un même graphe.
    
    Parameters:
    - chemins_csv : liste de chemins vers fichiers CSV
    - chemin_sortie : dossier où sauvegarder le PDF
    """

    plt.figure(figsize=(14, 8))

    couleurs = [ "#d62728", "#1f77b4", "#2ca036", "#9467bd", "#ff7f0e", "#17becf"]

    y_min_global = float('inf')
    y_max_global = float('-inf')

    # --- 1. Lecture de chaque CSV ---
    for idx, chemin_csv in enumerate(chemins_csv):
        k_values = []
        ratios = []

        with open(chemin_csv, mode='r') as file:
            reader = csv.DictReader(file)
            colonnes = reader.fieldnames

            # On suppose : k + UNE autre colonne ratio
            ratio_col = [col for col in colonnes if col != 'k'][0]
            nom = ratio_col.replace("ratio_", "")

            for row in reader:
                k_values.append(int(row['k']))
                val = row[ratio_col]
                ratios.append(float(val) if val != '' else np.nan)

        ratios = np.array(ratios, dtype=float)
        k_values = np.array(k_values)

        couleur = couleurs[idx % len(couleurs)]

        # --- nettoyage ---
        valid = ~np.isnan(ratios)
        k_valid = k_values[valid]
        ratios_valid = ratios[valid]

        if len(ratios_valid) == 0:
            continue

        y_min_global = min(y_min_global, np.min(ratios_valid))
        y_max_global = max(y_max_global, np.max(ratios_valid))

        # --- métriques ---
        robustness = np.max(ratios_valid)
        k_rob = k_valid[np.argmax(ratios_valid)]

        if len(ratios_valid) > 2500:
            consistence = ratios_valid[2499]
            k_cons = k_valid[2499]
        else:
            consistence = ratios_valid[-1]
            k_cons = k_valid[-1]

        # --- tracé ---
        plt.scatter(k_valid, ratios_valid, color=couleur, alpha=0.3, s=15,
                    label=f"{nom} (C={consistence:.3f}, R={robustness:.3f})")

        offset_y_rob = 10 + (idx * 15)
        offset_y_cons = -20 - (idx * 15)

        # Robustesse
        plt.axhline(y=robustness, color=couleur, linestyle=':', alpha=0.7)
        plt.scatter(k_rob, robustness, color=couleur, s=80, edgecolors='black')
        plt.annotate(f'Robustness_{nom}: {robustness:.3f}',
                     xy=(k_rob, robustness), xytext=(20, offset_y_rob),
                     textcoords='offset points',
                     arrowprops=dict(arrowstyle='->', color=couleur),
                     fontsize=9, fontweight='bold', color=couleur)

        # Consistance
        plt.axhline(y=consistence, color=couleur, linestyle=':', alpha=0.7)
        plt.scatter(k_cons, consistence, color=couleur, s=80, edgecolors='black')
        plt.annotate(f'Consistency_{nom}: {consistence:.3f}',
                     xy=(k_cons, consistence), xytext=(20, offset_y_cons),
                     textcoords='offset points',
                     arrowprops=dict(arrowstyle='->', color=couleur),
                     fontsize=9, fontweight='bold', color=couleur)

    # --- 2. Mise en forme ---
    plt.xlabel("k facilities", fontsize=13)
    plt.ylabel("competitive ratio", fontsize=13)

    plt.grid(True, linestyle='--', alpha=0.3)
    plt.legend()

    if y_min_global != float('inf'):
        plt.ylim(y_min_global - 0.05, y_max_global + 0.15)

    # --- 3. Sauvegarde ---
    output_path = os.path.join("/Users/imrane/Desktop/Online bidding/online-bidding/application_new/graph", "graph_multi_csv.pdf")
    plt.tight_layout()
    plt.savefig(output_path)

    print(f"Graphique sauvegardé dans : {output_path}")
    plt.show()

def split_csv_ratios(chemin):
    """
    Lit le fichier ratios_export.csv et crée 3 fichiers :
    - ratio_LP.csv
    - ratio_spyros.csv
    - ratio_w_haut.csv
    
    Chaque fichier contient :
    k, valeur
    """
    
    input_file = os.path.join(chemin, "ratios_export.csv")
    
    # Préparer les fichiers de sortie
    colonnes = ["ratio_LP", "ratio_spyros", "ratio_w_haut"]
    fichiers = {}
    writers = {}

    # Ouverture des fichiers en écriture
    for col in colonnes:
        f = open(os.path.join(chemin, f"{col}.csv"), mode='w', newline='')
        writer = csv.writer(f)
        writer.writerow(["k", col])
        
        fichiers[col] = f
        writers[col] = writer

    # Lecture du fichier principal
    with open(input_file, mode='r') as file:
        reader = csv.DictReader(file)
        
        for row in reader:
            k = row["k"]
            
            for col in colonnes:
                valeur = row[col]
                writers[col].writerow([k, valeur])

    # Fermeture des fichiers
    for f in fichiers.values():
        f.close()

    print("Fichiers créés avec succès :")
    for col in colonnes:
        print(f" - {col}.csv")

if __name__ == "__main__":
    racine = "/Users/imrane/Desktop/Online bidding/online-bidding/application_new/ratios"

    LP     = os.path.join(racine, "ratio_LP.csv")
    spyros = os.path.join(racine, "ratio_spyros.csv")
    w_haut_R_4 = os.path.join(racine, "ratio_w_haut_R=4.csv")
    w_1    = os.path.join(racine, "ratio_w=1.csv")
    chemins = [LP, spyros, w_haut_R_4, w_1]
    graph_multi_csv(chemins, racine)