import pandas as pd
import matplotlib.pyplot as plt
import glob
import os

# Find CSV files using glob
def load_latest_csv(pattern):
    """Load the most recent CSV file matching the pattern"""
    files = glob.glob(pattern)
    if not files:
        print(f"Aviso: Nenhum ficheiro encontrado com o padrão '{pattern}'")
        return None
    # Sort by modification time, get the latest
    latest_file = max(files, key=os.path.getmtime)
    print(f"A carregar: {latest_file}")
    return pd.read_csv(latest_file)

print("="*60)
print("ANÁLISE COMPLETA DE SIMULAÇÃO")
print("="*60)

# Carregar todos os dados
print("\nA procurar ficheiros de análise...")
low = load_latest_csv('analysis/LOW_LOAD_*.csv')
medium = load_latest_csv('analysis/MEDIUM_LOAD_*.csv')
high = load_latest_csv('analysis/HIGH_LOAD_*.csv')

# Check if we have all data
if low is None or medium is None or high is None:
    print("\nErro: Ficheiros de análise em falta!")
    print("Por favor execute a análise batch primeiro.")
    exit(1)

# Create output directory for graphs
os.makedirs('graphs', exist_ok=True)

# Determine the run column name (could be 'Run' or 'Execução')
run_col = 'Run' if 'Run' in low.columns else 'Execução'

print(f"\nColunas disponíveis: {low.columns.tolist()}")

# ==============================================================================
# GRÁFICOS COMPARATIVOS (entre cargas)
# ==============================================================================

print("\n" + "="*60)
print("A GERAR GRÁFICOS COMPARATIVOS")
print("="*60)

# 1. Gráfico: Dwelling Time vs Load
plt.figure(figsize=(10, 6))
dwelling_times = [
    low['TempoMédioSistema'].mean(),
    medium['TempoMédioSistema'].mean(),
    high['TempoMédioSistema'].mean()
]
plt.bar(['Baixa', 'Média', 'Alta'], dwelling_times, color=['green', 'orange', 'red'])
plt.ylabel('Tempo Médio no Sistema (s)')
plt.title('Desempenho do Sistema vs Carga')
plt.xlabel('Cenário de Carga')
plt.grid(axis='y', alpha=0.3)
for i, v in enumerate(dwelling_times):
    plt.text(i, v + 1, f'{v:.2f}s', ha='center', va='bottom')
plt.savefig('graphs/dwelling_time_comparison.png', dpi=300, bbox_inches='tight')
print("Gráfico guardado: graphs/dwelling_time_comparison.png")
plt.close()

# 2. Gráfico: Completion Rate vs Load
plt.figure(figsize=(10, 6))
completion_rates = [
    low['TaxaConclusão'].mean(),
    medium['TaxaConclusão'].mean(),
    high['TaxaConclusão'].mean()
]
plt.bar(['Baixa', 'Média', 'Alta'], completion_rates, color=['green', 'orange', 'red'])
plt.ylabel('Taxa de Conclusão (%)')
plt.title('Taxa de Conclusão de Veículos vs Carga')
plt.xlabel('Cenário de Carga')
plt.grid(axis='y', alpha=0.3)
plt.ylim(0, 100)
for i, v in enumerate(completion_rates):
    plt.text(i, v + 2, f'{v:.1f}%', ha='center', va='bottom')
plt.savefig('graphs/completion_rate_comparison.png', dpi=300, bbox_inches='tight')
print("Gráfico guardado: graphs/completion_rate_comparison.png")
plt.close()

# 3. Gráfico: Waiting Time vs Load
plt.figure(figsize=(10, 6))
waiting_times = [
    low['TempoMédioEspera'].mean(),
    medium['TempoMédioEspera'].mean(),
    high['TempoMédioEspera'].mean()
]
plt.bar(['Baixa', 'Média', 'Alta'], waiting_times, color=['green', 'orange', 'red'])
plt.ylabel('Tempo Médio de Espera (s)')
plt.title('Tempo Médio de Espera vs Carga')
plt.xlabel('Cenário de Carga')
plt.grid(axis='y', alpha=0.3)
for i, v in enumerate(waiting_times):
    plt.text(i, v + 1, f'{v:.2f}s', ha='center', va='bottom')
plt.savefig('graphs/waiting_time_comparison.png', dpi=300, bbox_inches='tight')
print("Gráfico guardado: graphs/waiting_time_comparison.png")
plt.close()

# 4. Gráfico: Summary Statistics (comparativo)
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(14, 10))
loads = ['Baixa', 'Média', 'Alta']

# Vehicles generated
ax1.bar(loads, [low['VeículosGerados'].mean(), medium['VeículosGerados'].mean(), high['VeículosGerados'].mean()], color=['green', 'orange', 'red'])
ax1.set_title('Veículos Gerados')
ax1.set_ylabel('Quantidade')
ax1.grid(axis='y', alpha=0.3)

# Vehicles completed
ax2.bar(loads, [low['VeículosCompletados'].mean(), medium['VeículosCompletados'].mean(), high['VeículosCompletados'].mean()], color=['green', 'orange', 'red'])
ax2.set_title('Veículos Concluídos')
ax2.set_ylabel('Quantidade')
ax2.grid(axis='y', alpha=0.3)

# Min/Max dwelling time
x = range(3)
width = 0.35
ax3.bar([i - width/2 for i in x], [low['TempoMínimoSistema'].mean(), medium['TempoMínimoSistema'].mean(), high['TempoMínimoSistema'].mean()], width, label='Mín', color='lightblue')
ax3.bar([i + width/2 for i in x], [low['TempoMáximoSistema'].mean(), medium['TempoMáximoSistema'].mean(), high['TempoMáximoSistema'].mean()], width, label='Máx', color='darkblue')
ax3.set_title('Tempo no Sistema Mín/Máx')
ax3.set_ylabel('Tempo (s)')
ax3.set_xticks(x)
ax3.set_xticklabels(loads)
ax3.legend()
ax3.grid(axis='y', alpha=0.3)

# Performance summary
metrics = ['Tempo no\nSistema', 'Tempo de\nEspera', 'Taxa de\nConclusão']
low_vals = [low['TempoMédioSistema'].mean(), low['TempoMédioEspera'].mean(), low['TaxaConclusão'].mean()]
med_vals = [medium['TempoMédioSistema'].mean(), medium['TempoMédioEspera'].mean(), medium['TaxaConclusão'].mean()]
high_vals = [high['TempoMédioSistema'].mean(), high['TempoMédioEspera'].mean(), high['TaxaConclusão'].mean()]

x = range(len(metrics))
width = 0.25
ax4.bar([i - width for i in x], low_vals, width, label='Baixa', color='green')
ax4.bar(x, med_vals, width, label='Média', color='orange')
ax4.bar([i + width for i in x], high_vals, width, label='Alta', color='red')
ax4.set_title('Resumo de Desempenho')
ax4.set_xticks(x)
ax4.set_xticklabels(metrics)
ax4.legend()
ax4.grid(axis='y', alpha=0.3)

plt.tight_layout()
plt.savefig('graphs/summary_statistics.png', dpi=300, bbox_inches='tight')
print("Gráfico guardado: graphs/summary_statistics.png")
plt.close()

# ==============================================================================
# GRÁFICOS INDIVIDUAIS POR CARGA
# ==============================================================================

def generate_individual_graphs(data, load_type, load_name, color):
    """Generate detailed graphs for a specific load type"""
    
    print(f"\n{'='*60}")
    print(f"A GERAR GRÁFICOS - CARGA {load_name.upper()}")
    print("="*60)
    
    # 1. Gráfico: Run-by-Run Dwelling Time
    plt.figure(figsize=(12, 6))
    plt.plot(data[run_col], data['TempoMédioSistema'], marker='o', color=color, linewidth=2, markersize=6)
    plt.fill_between(data[run_col], data['TempoMínimoSistema'], data['TempoMáximoSistema'], alpha=0.2, color=color)
    plt.ylabel('Tempo no Sistema (s)')
    plt.xlabel('Número da Execução')
    plt.title(f'Tempo no Sistema por Execução - Carga {load_name}')
    plt.grid(alpha=0.3)
    plt.legend(['Média', 'Intervalo Min-Max'])
    plt.savefig(f'graphs/{load_type.lower()}_dwelling_time_runs.png', dpi=300, bbox_inches='tight')
    print(f"Gráfico guardado: graphs/{load_type.lower()}_dwelling_time_runs.png")
    plt.close()

    # 2. Gráfico: Run-by-Run Completion Rate
    plt.figure(figsize=(12, 6))
    plt.plot(data[run_col], data['TaxaConclusão'], marker='o', color=color, linewidth=2, markersize=6)
    plt.axhline(y=data['TaxaConclusão'].mean(), color='black', linestyle='--', label=f'Média: {data["TaxaConclusão"].mean():.1f}%')
    plt.ylabel('Taxa de Conclusão (%)')
    plt.xlabel('Número da Execução')
    plt.title(f'Taxa de Conclusão por Execução - Carga {load_name}')
    plt.ylim(0, 105)
    plt.grid(alpha=0.3)
    plt.legend()
    plt.savefig(f'graphs/{load_type.lower()}_completion_rate_runs.png', dpi=300, bbox_inches='tight')
    print(f"Gráfico guardado: graphs/{load_type.lower()}_completion_rate_runs.png")
    plt.close()

    # 3. Gráfico: Run-by-Run Waiting Time
    plt.figure(figsize=(12, 6))
    plt.plot(data[run_col], data['TempoMédioEspera'], marker='o', color=color, linewidth=2, markersize=6)
    plt.ylabel('Tempo de Espera (s)')
    plt.xlabel('Número da Execução')
    plt.title(f'Tempo Médio de Espera por Execução - Carga {load_name}')
    plt.grid(alpha=0.3)
    plt.savefig(f'graphs/{load_type.lower()}_waiting_time_runs.png', dpi=300, bbox_inches='tight')
    print(f"Gráfico guardado: graphs/{load_type.lower()}_waiting_time_runs.png")
    plt.close()

    # 4. Gráfico: Vehicles Generated vs Completed
    plt.figure(figsize=(10, 6))
    x = range(len(data))
    width = 0.35
    plt.bar([i - width/2 for i in x], data['VeículosGerados'], width, label='Gerados', color='lightblue', alpha=0.8)
    plt.bar([i + width/2 for i in x], data['VeículosCompletados'], width, label='Concluídos', color=color, alpha=0.8)
    plt.ylabel('Número de Veículos')
    plt.xlabel('Número da Execução')
    plt.title(f'Veículos Gerados vs Concluídos - Carga {load_name}')
    plt.xticks(x, data[run_col])
    plt.legend()
    plt.grid(axis='y', alpha=0.3)
    plt.savefig(f'graphs/{load_type.lower()}_vehicles_comparison.png', dpi=300, bbox_inches='tight')
    print(f"Gráfico guardado: graphs/{load_type.lower()}_vehicles_comparison.png")
    plt.close()

    # 5. Gráfico: Summary Statistics (4-panel)
    fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(14, 10))

    # Panel 1: Dwelling Time Statistics
    metrics = ['Média', 'Mínimo', 'Máximo', 'Desvio\nPadrão']
    values = [
        data['TempoMédioSistema'].mean(),
        data['TempoMínimoSistema'].min(),
        data['TempoMáximoSistema'].max(),
        data['TempoMédioSistema'].std()
    ]
    ax1.bar(metrics, values, color=[color, 'lightblue', 'darkblue', 'gray'])
    ax1.set_title('Estatísticas de Tempo no Sistema')
    ax1.set_ylabel('Tempo (s)')
    ax1.grid(axis='y', alpha=0.3)
    for i, v in enumerate(values):
        ax1.text(i, v + 0.5, f'{v:.2f}s', ha='center', va='bottom')

    # Panel 2: Waiting Time Statistics
    values = [
        data['TempoMédioEspera'].mean(),
        data['TempoMédioEspera'].min(),
        data['TempoMédioEspera'].max(),
        data['TempoMédioEspera'].std()
    ]
    ax2.bar(metrics, values, color=[color, 'lightblue', 'darkblue', 'gray'])
    ax2.set_title('Estatísticas de Tempo de Espera')
    ax2.set_ylabel('Tempo (s)')
    ax2.grid(axis='y', alpha=0.3)
    for i, v in enumerate(values):
        ax2.text(i, v + 0.5, f'{v:.2f}s', ha='center', va='bottom')

    # Panel 3: Completion Rate Distribution
    ax3.hist(data['TaxaConclusão'], bins=10, color=color, alpha=0.7, edgecolor='black')
    ax3.axvline(data['TaxaConclusão'].mean(), color='red', linestyle='--', linewidth=2, label='Média')
    ax3.set_title('Distribuição da Taxa de Conclusão')
    ax3.set_xlabel('Taxa de Conclusão (%)')
    ax3.set_ylabel('Frequência')
    ax3.legend()
    ax3.grid(axis='y', alpha=0.3)

    # Panel 4: Key Metrics Summary
    summary_metrics = ['Veículos\nGerados', 'Veículos\nConcluídos', 'Taxa de\nConclusão (%)']
    summary_values = [
        data['VeículosGerados'].mean(),
        data['VeículosCompletados'].mean(),
        data['TaxaConclusão'].mean()
    ]
    # Create bars individually with different alpha values
    alphas = [0.5, 0.7, 0.9]
    for i, (metric, value, alpha_val) in enumerate(zip(summary_metrics, summary_values, alphas)):
        ax4.bar(i, value, color=color, alpha=alpha_val)
    ax4.set_xticks(range(len(summary_metrics)))
    ax4.set_xticklabels(summary_metrics)
    ax4.set_title('Resumo de Métricas-Chave')
    ax4.grid(axis='y', alpha=0.3)
    for i, v in enumerate(summary_values):
        ax4.text(i, v + max(summary_values)*0.02, f'{v:.1f}', ha='center', va='bottom', fontweight='bold')

    plt.tight_layout()
    plt.savefig(f'graphs/{load_type.lower()}_summary_statistics.png', dpi=300, bbox_inches='tight')
    print(f"Gráfico guardado: graphs/{load_type.lower()}_summary_statistics.png")
    plt.close()

    # Print detailed summary statistics
    print(f"\n{'='*60}")
    print(f"CARGA {load_name.upper()} - ESTATÍSTICAS DETALHADAS")
    print("="*60)

    print(f"\nTEMPO NO SISTEMA:")
    print(f"  Média: {data['TempoMédioSistema'].mean():.2f}s")
    print(f"  Desvio Padrão: {data['TempoMédioSistema'].std():.2f}s")
    print(f"  Mínimo: {data['TempoMínimoSistema'].min():.2f}s")
    print(f"  Máximo: {data['TempoMáximoSistema'].max():.2f}s")
    print(f"  Mediana: {data['TempoMédioSistema'].median():.2f}s")

    print(f"\nTEMPO DE ESPERA:")
    print(f"  Média: {data['TempoMédioEspera'].mean():.2f}s")
    print(f"  Desvio Padrão: {data['TempoMédioEspera'].std():.2f}s")
    print(f"  Mínimo: {data['TempoMédioEspera'].min():.2f}s")
    print(f"  Máximo: {data['TempoMédioEspera'].max():.2f}s")
    print(f"  Mediana: {data['TempoMédioEspera'].median():.2f}s")

    print(f"\nTAXA DE CONCLUSÃO:")
    print(f"  Média: {data['TaxaConclusão'].mean():.2f}%")
    print(f"  Desvio Padrão: {data['TaxaConclusão'].std():.2f}%")
    print(f"  Mínimo: {data['TaxaConclusão'].min():.2f}%")
    print(f"  Máximo: {data['TaxaConclusão'].max():.2f}%")
    print(f"  Mediana: {data['TaxaConclusão'].median():.2f}%")

    print(f"\nCONTAGEM DE VEÍCULOS:")
    print(f"  Média Gerados: {data['VeículosGerados'].mean():.0f}")
    print(f"  Média Concluídos: {data['VeículosCompletados'].mean():.0f}")
    print(f"  Média Perdidos: {data['VeículosGerados'].mean() - data['VeículosCompletados'].mean():.0f}")

    print(f"\nEXECUÇÕES ANALISADAS: {len(data)}")

    # Check for config file column - could be ArquivoConfig or ConfigFile
    config_col = None
    if 'ArquivoConfig' in data.columns:
        config_col = 'ArquivoConfig'
    elif 'ConfigFile' in data.columns:
        config_col = 'ConfigFile'

    if config_col:
        print(f"FICHEIRO DE CONFIGURAÇÃO: {data[config_col].iloc[0]}")

# Generate individual graphs for each load
generate_individual_graphs(low, 'LOW', 'Baixa', 'green')
generate_individual_graphs(medium, 'MEDIUM', 'Média', 'orange')
generate_individual_graphs(high, 'HIGH', 'Alta', 'red')

# ==============================================================================
# SUMÁRIO FINAL
# ==============================================================================

print("\n" + "="*60)
print("SUMÁRIO COMPARATIVO FINAL")
print("="*60)

print(f"\nCARGA BAIXA:")
print(f"  Tempo Médio no Sistema: {low['TempoMédioSistema'].mean():.2f}s")
print(f"  Tempo Médio de Espera: {low['TempoMédioEspera'].mean():.2f}s")
print(f"  Taxa de Conclusão: {low['TaxaConclusão'].mean():.1f}%")
print(f"  Veículos Gerados: {low['VeículosGerados'].mean():.0f}")
print(f"  Veículos Concluídos: {low['VeículosCompletados'].mean():.0f}")

print(f"\nCARGA MÉDIA:")
print(f"  Tempo Médio no Sistema: {medium['TempoMédioSistema'].mean():.2f}s")
print(f"  Tempo Médio de Espera: {medium['TempoMédioEspera'].mean():.2f}s")
print(f"  Taxa de Conclusão: {medium['TaxaConclusão'].mean():.1f}%")
print(f"  Veículos Gerados: {medium['VeículosGerados'].mean():.0f}")
print(f"  Veículos Concluídos: {medium['VeículosCompletados'].mean():.0f}")

print(f"\nCARGA ALTA:")
print(f"  Tempo Médio no Sistema: {high['TempoMédioSistema'].mean():.2f}s")
print(f"  Tempo Médio de Espera: {high['TempoMédioEspera'].mean():.2f}s")
print(f"  Taxa de Conclusão: {high['TaxaConclusão'].mean():.1f}%")
print(f"  Veículos Gerados: {high['VeículosGerados'].mean():.0f}")
print(f"  Veículos Concluídos: {high['VeículosCompletados'].mean():.0f}")

print("\n" + "="*60)
print("ANÁLISE COMPLETA!")
print(f"Total de gráficos gerados: 19")
print("Todos os gráficos foram guardados no diretório 'graphs/'")
print("="*60)
