import pandas as pd
import matplotlib.pyplot as plt
import os 
import numpy as np
# Leitura do arquivo

main_folder = "./"

scenarios = [name for name in os.listdir(main_folder) if os.path.isdir(os.path.join(main_folder, name))]

scenarios = sorted(
    scenarios,
    key=lambda x: (
        x != "no_slicing", 
        int(x.split('_')[-1]) if x.startswith('scen_') and x.split('_')[-1].isdigit() else float('inf')
    )
)

ue_dataframes = {}

for scenario in scenarios:
    ue_dataframes[scenario] = {}
    scenario_path = main_folder + scenario
    cap_confs_list = [name for name in os.listdir(scenario_path) if os.path.isdir(os.path.join(scenario_path, name))]  
    for cap_conf_folder in cap_confs_list: 
        ue_dataframes[scenario][cap_conf_folder] = {}
        cap_path = scenario_path + '/' + cap_conf_folder
        ues = [name for name in os.listdir(cap_path) if os.path.isdir(os.path.join(cap_path, name))]
        for ue in ues: 
            data = []
            ue_path = cap_path + '/' + ue + '/' + 'job_1.txt'
            ##Organização do dataframe

            with open(ue_path, 'r') as file:
                count = 0
                data.append({
                                "Interval": 0,
                                "Transfer": 0,
                                "Bandwidth": 0,
                                "Jitter": 0,
                                "PacketsLost": 0,
                                "TotalPackets": 0
                            })
                for line in file:
                    if "[  3]" in line and "sec" in line and "MBytes" in line:
                        parts = line.split()
                        count += 1
                        if count < 10: 
                            data.append({
                                "Interval": count,
                                "Transfer": parts[5],
                                "Bandwidth": float(parts[7]),
                                "Jitter": parts[9] if len(parts) > 6 else None,
                                "PacketsLost": int(parts[-2].split("/")[0]) if "/" in parts[-2] else int(parts[-3].split("/")[0]),
                                "TotalPackets": int(parts[-2].split("/")[1]) if "/" in parts[-2] else int(parts[-2])
                            })
                        elif count < 60:
                            data.append({
                                "Interval": count,
                                "Transfer": parts[4],
                                "Bandwidth": float(parts[6]),
                                "Jitter": parts[8] if len(parts) > 6 else None,
                                "PacketsLost": int(parts[-2].split("/")[0]) if "/" in parts[-2] else int(parts[-3].split("/")[0]),
                                "TotalPackets": int(parts[-2].split("/")[1]) if "/" in parts[-2] else int(parts[-2])
                            })
                        else:
                            break
            ue_dataframes[scenario][cap_conf_folder][ue] = pd.DataFrame(data)

for scenario in scenarios:
    conf_list = []
    pl_ue1 = []
    pl_ue2 = []
    scenario_path = main_folder + scenario
    cap_confs_list = [name for name in os.listdir(scenario_path) if os.path.isdir(os.path.join(scenario_path, name))] ## Configuração da capacidade dos slices
    cap_confs_list = sorted(cap_confs_list, key=lambda x: (x == 'no_slicing', x))
    with open(os.path.join(scenario_path, "scenario_description.txt"), 'r') as file:
        scenario_file = file.read().split("\n")
    scenario_info = {item.split(':', 1)[0].strip(): item.split(':', 1)[1].strip() for item in scenario_file if item}
    for cap_conf_folder in cap_confs_list:
        cap_path = scenario_path + '/' + cap_conf_folder
        with open(os.path.join(cap_path, "cap_conf_description.txt"), 'r') as file:
            cap_conf_description = file.read().split("\n")
        cap_conf_info = {item.split(':', 1)[0].strip(): item.split(':', 1)[1].strip() for item in cap_conf_description if item}
        plt.plot(ue_dataframes[scenario][cap_conf_folder]['ue1']["Interval"], ue_dataframes[scenario][cap_conf_folder]['ue1']["Bandwidth"], marker="o", label=f"UE1 (Banda: {scenario_info['UE1_bandwidth']} Mbps)", color='#ff7f0e', linestyle="-")
        plt.plot(ue_dataframes[scenario][cap_conf_folder]['ue2']["Interval"], ue_dataframes[scenario][cap_conf_folder]['ue2']["Bandwidth"], marker="o", label=f"UE2 (Banda: {scenario_info['UE2_bandwidth']} Mbps)", color='#1f77b4', linestyle="--")
        y_ticks = np.arange(0, max(ue_dataframes[scenario][cap_conf_folder]['ue2']["Bandwidth"].max(),
                              ue_dataframes[scenario][cap_conf_folder]['ue1']["Bandwidth"].max()) + 10, 10)  # Intervalo de 2 Mbps
        plt.yticks(y_ticks)  # Define os valores do eixo Y com intervalos mais detalhados 
        # if cap_conf_info['UE1_slice'] != '-':
        #     plt.title(f"Taxa Efetiva de Usuários Móveis: UE1 no Slice 1 ({cap_conf_info['UE1_slice']}% dos Recursos) e UE2 no Slice 2 ({cap_conf_info['UE2_slice']}% dos Recursos)")
        # else:
        #     plt.title(f"Taxa Efetiva de Usuários sem configuração dos slices") 
        plt.xlabel("Tempo (s)")
        plt.ylabel("Taxa efetiva (Mbps)")
        plt.grid(which="both", linestyle="--", linewidth=0.5, alpha=0.7)  # Grelha mais sutil
        plt.tight_layout()  # Garante que todos os elementos estejam visíveis
        plt.legend()
        if cap_conf_info['UE1_slice'] != '-' and cap_conf_info['UE2_slice'] != '-':
            conf_list.append(f"Conf. {cap_conf_info['UE1_slice']}% / {cap_conf_info['UE2_slice']}%")
        else:
            conf_list.append(f'Conf. No slice')
        plt.tight_layout()
        pl_ue1.append((ue_dataframes[scenario][cap_conf_folder]['ue1']["PacketsLost"].sum()/ue_dataframes[scenario][cap_conf_folder]['ue1']["TotalPackets"].sum())*100)
        pl_ue2.append((ue_dataframes[scenario][cap_conf_folder]['ue2']["PacketsLost"].sum()/ue_dataframes[scenario][cap_conf_folder]['ue2']["TotalPackets"].sum())*100)
        plt.show()
    # Configurar a posição das barras no eixo x
    x = np.arange(len(conf_list))  # Posições das scenarios
    largura = 0.4  # Largura das barras
    # Criar as barras
    plt.bar(x - largura / 2, pl_ue1, width=largura, label=f"UE1 (Banda: {scenario_info['UE1_bandwidth']} Mbps)", color='#ff7f0e')  # Barras para UE1
    plt.bar(x + largura / 2, pl_ue2, width=largura, label=f"UE2 (Banda: {scenario_info['UE2_bandwidth']} Mbps)", color='#1f77b4')  # Barras para UE2

    # Adicionar rótulos e título
    plt.xlabel('Diferentes configurações de capacidade (Slice 1 / Slice 2)')
    plt.ylabel('Perda de pacote (%)')
    # plt.title('Perda de Pacotes (%) para Diferentes Configurações de Capacidade')
    plt.xticks(x, conf_list)  # Ajustar rótulos do eixo x
    plt.legend()  # Adicionar legenda

    # Exibir o gráfico
    plt.tight_layout()
    plt.show()