import pandas as pd
import numpy as np
import json
from pathlib import Path
from scipy.signal import savgol_filter
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_rgp(caminho_arquivo):
    """Lê o JSON do .rgp e extrai drill, feed e depth (chaves em minúsculo)."""
    try:
        with open(caminho_arquivo, 'r', encoding='utf-8') as f:
            dados = json.load(f)

        # Acessando chaves em minúsculo conforme estrutura real do arquivo
        drill = np.array(dados['profile']['drill'])
        feed = np.array(dados['profile']['feed'])
        # depthMsmt está dentro de 'header' (minúsculo)
        depth = dados['header']['depthMsmt']

        # Filtro Savitzky-Golay para manter a integridade dos picos da madeira
        drill_filtrado = savgol_filter(drill, window_length=31, polyorder=3)

        return {
            "rp_media": np.mean(drill_filtrado),
            "rp_max": np.max(drill_filtrado),
            "feed_medio": np.mean(feed),
            "profundidade_total": depth
        }
    except Exception as e:
        print(f"Erro ao processar {caminho_arquivo.name}: {e}")
        return None

# --- 1. LER E CONSOLIDAR PLANILHA DE LABORATÓRIO ---
print("Lendo planilha de laboratório...")
abas = pd.read_excel(ARQUIVO_EXCEL, sheet_name=None)
df_lab = pd.concat(abas.values(), ignore_index=True)

# Garante que ME.Bas e Registro sejam numéricos
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 ARQUIVOS RGP E CRUZAR DADOS ---
resultados_resisto = []

print("Processando arquivos .rgp...")
for index, row in df_lab.iterrows():
    # Converte Registro 16 -> "016" para buscar Measurement016.rgp
    num_registro = str(int(row['Registro'])).zfill(3)
    nome_arquivo = f"Measurement{num_registro}.rgp"
    caminho_rgp = PASTA_AMOSTRAS / nome_arquivo

    if caminho_rgp.exists():
        dados_furo = extrair_dados_rgp(caminho_rgp)
        if dados_furo:
            dados_furo['Registro'] = row['Registro']
            resultados_resisto.append(dados_furo)
    else:
        # Tenta sem o zero à esquerda caso o arquivo seja Measurement16.rgp
        caminho_alternativo = PASTA_AMOSTRAS / f"Measurement{int(row['Registro'])}.rgp"
        if caminho_alternativo.exists():
            dados_furo = extrair_dados_rgp(caminho_alternativo)
            if dados_furo:
                dados_furo['Registro'] = row['Registro']
                resultados_resisto.append(dados_furo)

# --- 3. CONSOLIDAÇÃO E ESTATÍSTICA ---
if not resultados_resisto:
    print("\nERRO CRÍTICO: Nenhum arquivo .rgp foi processado com sucesso.")
    print("Verifique se os arquivos estão na pasta: " + str(PASTA_AMOSTRAS))
else:
    df_resisto = pd.DataFrame(resultados_resisto)
    df_final = pd.merge(df_lab, df_resisto, on='Registro')

    # X = Resistência Média, Y = Densidade Básica
    x = df_final['rp_media']
    y = df_final['ME.Bas']

    r, p_valor = pearsonr(x, y)

    print(f"\n--- RESULTADOS COM {len(df_final)} AMOSTRAS ---")
    print(f"Correlação (r): {r:.4f}")
    print(f"R²: {r**2:.4f}")
    print(f"P-valor: {p_valor:.4e}")

    # Salvar Excel Final
    saida_excel = BASE_DIR / "Gateados 2025" / "RESULTADO_CONSOLIDADO.xlsx"
    df_final.to_excel(saida_excel, index=False)

    # Gráfico de Dispersão
    plt.figure(figsize=(10, 6))
    plt.scatter(x, y, color='teal', alpha=0.6)
    m, b = np.polyfit(x, y, 1)
    plt.plot(x, m*x + b, color='red', label=f'R² = {r**2:.2f}')
    plt.title('Validação Resistógrafo: RP vs Densidade (Laboratório)')
    plt.xlabel('Amplitude Média (Resistógrafo)')
    plt.ylabel('Densidade Básica (Baguetas)')
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.savefig(BASE_DIR / "Gateados 2025" / "grafico_validacao.png")
    plt.show()
