import pandas as pd
import numpy as np
import json
import os
from pathlib import Path
from scipy.signal import savgol_filter

# --- COEFICIENTES DE CALIBRAÇÃO (Ajuste com seus valores reais) ---
M_COEFF = 0.012345
B_COEFF = 0.123456

BASE_DIR = Path(__file__).parent

# Lista das Unidades (Pastas Mãe)
PASTAS_MAE = [
    "Amata- teste",
    "Campo Alto",
    "FRP Campo Novo Proc. Alamos",
    "FRP Campo Novo Proc. FRP",
    "FRP Cerro Verde Proc. Alamos",
    "FRP Cerro Verde Proc. FRP",
    "Gateados"
]

def buscar_sinal_no_json(obj):
    """Busca recursiva pela chave 'drill' ou similar dentro do JSON."""
    if isinstance(obj, dict):
        if 'drill' in obj:
            return obj['drill']
        for v in obj.values():
            res = buscar_sinal_no_json(v)
            if res is not None: return res
    elif isinstance(obj, list):
        for item in obj:
            res = buscar_sinal_no_json(item)
            if res is not None: return res
    return None

def processar_arquivo(caminho):
    try:
        with open(caminho, 'r', encoding='utf-8', errors='ignore') as f:
            dados = json.load(f)

        # Tenta pegar pelo caminho padrão, se falhar, faz a busca profunda
        sinal = dados.get('profile', {}).get('drill')
        if sinal is None:
            sinal = buscar_sinal_no_json(dados)

        if sinal is None or len(sinal) < 31:
            return None, None

        drill = np.array(sinal)
        # Filtro SG
        filtrado = savgol_filter(drill, 31, 3)
        rp_med = np.mean(filtrado)
        db_est = (M_COEFF * rp_med) + B_COEFF
        return round(rp_med, 4), round(db_est, 4)
    except:
        return None, None

print("🔍 Iniciando varredura profunda...")

for unidade in PASTAS_MAE:
    caminho_unidade = BASE_DIR / unidade
    if not caminho_unidade.exists():
        print(f"⚠️  Pulando {unidade} (não encontrada).")
        continue

    lista_resultados = []
    print(f"📂 Processando: {unidade}...")

    # os.walk é o mais seguro para garantir que entre em TODOS os blocos
    for raiz, dirs, arquivos in os.walk(caminho_unidade):
        for arquivo in arquivos:
            if arquivo.lower().endswith(".rgp"):
                caminho_completo = Path(raiz) / arquivo
                rp, db = processar_arquivo(caminho_completo)

                if rp is not None:
                    lista_resultados.append({
                        "Arquivo": arquivo,
                        "Bloco": Path(raiz).name,
                        "RP_Media": rp,
                        "DB_Estimada": db
                    })

    if lista_resultados:
        df = pd.DataFrame(lista_resultados)
        df = df.sort_values(by=["Bloco", "Arquivo"])

        # Nome limpo conforme solicitado
        nome_limpo = unidade.replace(" ", "_").replace("-", "")
        arquivo_saida = BASE_DIR / f"RPmed_{nome_limpo}.xlsx"

        df.to_excel(arquivo_saida, index=False)
        print(f"   ✅ Sucesso: {len(df)} arquivos processados em {arquivo_saida.name}")
    else:
        print(f"   ❌ Erro: Nenhum dado válido encontrado dentro dos arquivos de {unidade}")

print("\n--- Finalizado ---")
