import pandas as pd
import numpy as np
import json
from pathlib import Path
from scipy.stats import pearsonr
import matplotlib.pyplot as plt

# --- CONFIGURAÇÕES DE CAMINHOS ---
BASE_DIR = Path(__file__).parent
PASTA_AMOSTRAS = BASE_DIR / "Gateados 2025" / "Amostra"
ARQUIVO_EXCEL = BASE_DIR / "Gateados 2025" / "BAGUETAS GATEADOS  densidade.xlsx"

def extrair_dados_sma(caminho_arquivo):
    """Lê o .rgp e aplica a Média Móvel Simples (SMA)."""
    try:
        with open(caminho_arquivo, 'r', encoding='utf-8') as f:
            dados = json.load(f)

        drill = np.array(dados['profile']['drill'])
        depth = dados['header']['depthMsmt']

        # --- MÉDIA MÓVEL SIMPLES (SMA) ---
        janela = 31
        drill_suavizado = pd.Series(drill).rolling(window=janela, center=True).mean().fillna(np.mean(drill)).values

        return {
            "rp_media": np.mean(drill_suavizado),
            "rp_max": np.max(drill_suavizado),
            "profundidade_total": depth
        }
    except Exception as e:
        print(f"Erro no arquivo {caminho_arquivo.name}: {e}")
        return None

# 1. Consolidar Planilhas de Laboratório (BLOCOS 1 a 4)
print("Lendo planilhas de laboratório (Método SMA)...")
abas = pd.read_excel(ARQUIVO_EXCEL, sheet_name=None)
df_lab = pd.concat(abas.values(), ignore_index=True)

# --- LIMPEZA DE COLUNAS FANTASMAS (Unnamed) ---
# Remove colunas que não têm nome ou que o Excel criou por erro de formatação
df_lab = df_lab.loc[:, ~df_lab.columns.str.contains('^Unnamed')]
df_lab = df_lab.dropna(axis=1, how='all')

# Garante tipos numéricos para o merge e remove linhas incompletas
df_lab['ME.Bas'] = pd.to_numeric(df_lab['ME.Bas'], errors='coerce')
df_lab['Registro'] = pd.to_numeric(df_lab['Registro'], errors='coerce')
df_lab = df_lab.dropna(subset=['ME.Bas', 'Registro'])

# 2. Processar RGP com SMA
resultados = []
print("Processando arquivos .rgp com Média Móvel Simples...")

for index, row in df_lab.iterrows():
    num_registro = str(int(row['Registro'])).zfill(3)
    nome_arq = f"Measurement{num_registro}.rgp"
    caminho = PASTA_AMOSTRAS / nome_arq

    if caminho.exists():
        dados = extrair_dados_sma(caminho)
        if dados:
            dados['Registro'] = row['Registro']
            resultados.append(dados)

# 3. Cruzamento e Geração de Outputs Limpos
if resultados:
    df_resisto = pd.DataFrame(resultados)
    df_final = pd.merge(df_lab, df_resisto, on='Registro')

    # Limpeza final pós-merge para garantir que nada sobrou
    df_final = df_final.loc[:, ~df_final.columns.str.contains('^Unnamed')]

    x = df_final['rp_media']
    y = df_final['ME.Bas']
    r, p = pearsonr(x, y)

    # --- NOMES DE OUTPUT PADRONIZADOS ---
    nome_excel_saida = BASE_DIR / "Gateados 2025" / "RESULTADOS_SMA.xlsx"
    nome_grafico_saida = BASE_DIR / "Gateados 2025" / "grafico_RESULTADOS_SMA.png"

    print(f"\n--- ANÁLISE CONCLUÍDA (SMA) ---")
    print(f"R² final: {r**2:.4f}")

    # Salvar Planilha Consolidada SMA Limpa
    df_final.to_excel(nome_excel_saida, index=False)
    print(f"Planilha limpa salva: {nome_excel_saida}")

    # Gerar Gráfico de Dispersão SMA
    plt.figure(figsize=(10, 6))
    plt.scatter(x, y, color='orange', alpha=0.6, label='Amostras (Média Móvel Simples)')
    m, b = np.polyfit(x, y, 1)
    plt.plot(x, m*x + b, color='black', linestyle='--', label=f'R² SMA = {r**2:.4f}')

    plt.title('Validação Resistógrafo: Média Móvel Simples (SMA)', fontsize=12)
    plt.xlabel('Resistência Média (Processada com SMA)', fontsize=10)
    plt.ylabel('Densidade Básica (ME.Bas Laboratório)', fontsize=10)
    plt.legend()
    plt.grid(True, alpha=0.3)

    plt.savefig(nome_grafico_saida)
    plt.show()
