import pandas as pd
import numpy as np
import random

def fix_kmedoids_random(fichier_csv, fichier_matrice, fichier_sortie="k_medoids_fixed_monotonie_random.csv"):
    print("Chargement des données...")
    df = pd.read_csv(fichier_csv)
    matrice_dist = np.load(fichier_matrice)
    n_total_points = matrice_dist.shape[0]
    tous_les_points = set(range(n_total_points))

    # On s'assure que le dataframe est bien trié par k
    df = df.sort_values(by='k').reset_index(drop=True)

    corrections = 0

    for i in range(1, len(df)):
        cout_prec = df.at[i-1, 'cout_F_k*']
        cout_actuel = df.at[i, 'cout_F_k*']

        if cout_actuel > cout_prec:
            # 1. Récupération de l'ensemble F_{k-1}
            f_k_prec_str = str(df.at[i-1, 'F_k*'])
            set_f_k_prec = set(int(x) for x in f_k_prec_str.split(';'))

            # 2. Choix d'un point aléatoire n'appartenant pas à F_{k-1}
            points_disponibles = list(tous_les_points - set_f_k_prec)
            point_aleatoire = random.choice(points_disponibles)

            # 3. Création du nouveau F_k
            nouveau_f_k = list(set_f_k_prec) + [point_aleatoire]

            # 4. Calcul du nouveau coût
            # On prend le min par ligne pour les colonnes des centres choisis
            distances_minimales = np.min(matrice_dist[:, nouveau_f_k], axis=1)
            nouveau_cout = np.sum(distances_minimales)

            # 5. Mise à jour du DataFrame
            df.at[i, 'cout_F_k*'] = nouveau_cout
            df.at[i, 'F_k*'] = ";".join(map(str, nouveau_f_k))
            
            # Optionnel : marquer que le temps de calcul est une correction rapide
            df.at[i, 'temps_calcul_s'] = 0.0 
            
            corrections += 1
            print(f"Anomalie corrigée pour k={df.at[i, 'k']} | Ancien coût: {cout_actuel:.0f} -> Nouveau: {nouveau_cout:.0f}")

    df.to_csv(fichier_sortie, index=False)
    print(f"Terminé ! {corrections} corrections appliquées. Sauvegardé dans {fichier_sortie}.")

# Utilisation :
path_opt = "/Users/imrane/Downloads/application/sym/sym_data/resultats_kmedoids.csv"
path_matrice = "/Users/imrane/Downloads/application/sym/sym_data/matrice_distances.npy"

fix_kmedoids_random(path_opt, path_matrice)