import os
import pandas as pd
import matplotlib.pyplot as plt
import shutil
from pathlib import Path

from metpy.units import units
import metpy.calc as mpcalc
from metpy.plots import SkewT

# ===== CONFIGURAÇÕES =====
USAR_DROPBOX = True
REFAZER_TODOS = False

if USAR_DROPBOX:
    # Agora utilizando uma lista para processar múltiplos diretórios em sequência
    BASE_DIRS = [
        Path(r"C:\Users\GeorgiaC\BIOMASP-MicroMeteo Dropbox\labmicro iag.usp.br\MCITY\Sondagens\CAMPO DE MARTE\EMR_DTCEA"),
        Path(r"C:\Users\GeorgiaC\BIOMASP-MicroMeteo Dropbox\labmicro iag.usp.br\MCITY\Sondagens\COTIA")
    ]
else:
    # Usando Path para normalizar o caminho do iCloud
    BASE_DIRS = [
        Path(r"D:\iCloudDrive\USP\Sondagens\EMR_IAG--Campo_de_Marte")
    ]

SITE_DIR1a  = Path(r"D:\Site\labmicro\Data\Radiossonda\PerfilT")
SITE_DIR1b  = Path(r"D:\Site\labmicro\Data\Radiossonda\SkewT")
SITE_DIR2a = Path(r"D:\iCloudDrive\USP\Website\data\Sounding\PerfilT")
SITE_DIR2b = Path(r"D:\iCloudDrive\USP\Website\data\Sounding\SkewT")

os.makedirs(SITE_DIR1a, exist_ok=True)
os.makedirs(SITE_DIR1b, exist_ok=True)
os.makedirs(SITE_DIR2a,exist_ok=True)
os.makedirs(SITE_DIR2b,exist_ok=True)

# =========================

def processa_arquivo(caminho_arquivo: Path, graf_dir: Path):
    nome = caminho_arquivo.stem
    
    saida_T_local = graf_dir / f"perfil_T_{nome}.png"
    saida_T_site  = SITE_DIR1a / f"perfil_T_{nome}.png"
    saida_T_site2 = SITE_DIR2a/ f"perfil_T_{nome}.png"
    saida_skew_local = graf_dir / f"skewT_{nome}.png"
    saida_skew_site  = SITE_DIR1b / f"skewT_{nome}.png"
    saida_skew_site2 = SITE_DIR2b/ f"skewT_{nome}.png"

    precisa_T = REFAZER_TODOS or not (saida_T_local.exists() and saida_T_site.exists())
    precisa_Skew = REFAZER_TODOS or not (saida_skew_local.exists() and saida_skew_site.exists())

    if not precisa_T and not precisa_Skew:
        return

    try:
        # O segredo: converter para string absoluta e usar encoding robusto
        # Alguns arquivos do iCloud precisam ser 'tocados' antes de abrir
        with open(str(caminho_arquivo.absolute()), 'r', encoding='utf-8', errors='ignore') as f:
            df = pd.read_csv(f, on_bad_lines='skip', engine='python')
    except Exception as e:
        print(f"Erro ao acessar {nome}: {e}")
        return

    if df.empty or "timestamp" not in df.columns:
        return

    # 1) Mantém apenas a fase de subida: burst_timer = -1
    if "burst_timer" in df.columns:
        # converte o que é número; horários viram NaN
        burst_num = pd.to_numeric(df["burst_timer"], errors="coerce")
        df = df[burst_num == -1]

    print(caminho_arquivo, "linhas após burst_timer == -1:", len(df))

    # 2) Garante colunas necessárias
    if not {"alt", "temp", "pressure", "humidity"}.issubset(df.columns):
        print(f"Pulando {caminho_arquivo}: faltam colunas necessárias.")
        return

    # 3) Remove apenas temperaturas inválidas (flag -273)
    df = df[df["temp"] > -200]          # remove -273 etc.
    print(caminho_arquivo, "linhas após temp > -200:", len(df))

    if df.empty:
        print(f"Pulando {caminho_arquivo}: nenhum dado válido após filtros simples.")
        return
    
    alt0 = df["alt"].iloc[0]
    temp0 = df["temp"].iloc[0]

    subtitulo = f"Serial: {df['serial'].iloc[0]} • Lançamento: {str(df['timestamp'].iloc[0])[:19]}"

    # ===== GERAÇÃO PERFIL T =====
    if precisa_T:
        plt.figure(figsize=(5, 8))
        plt.plot(df["temp"], df["alt"], color="red")
        plt.title("Perfil vertical de temperatura", fontsize=16, y=1.04)
        plt.suptitle(subtitulo, fontsize=9, x=0.55, y=0.91)
        plt.grid(True)
        
        # Marcar a altitude inicial que o registro começou.
        plt.scatter([temp0], [alt0], color="black", s=40, zorder=5)
        # texto para dentro do gráfico
        plt.annotate(f"{alt0:.0f} m",
                    xy=(temp0, alt0),            # onde está o ponto
                    xytext=(temp0 - 15, alt0 + 1500),  # posição do texto (mais à esquerda e acima)
                    textcoords="data",
                    arrowprops=dict(arrowstyle="->", color="black"),
                    ha="right", va="bottom",
                    fontsize=10)        
        
        plt.tight_layout()
        plt.savefig(str(saida_T_local), dpi=150)
        shutil.copy(str(saida_T_local), str(saida_T_site))
        shutil.copy2(str(saida_T_local), str(saida_T_site2))
        plt.close()
        print(f"OK: Perfil T -> {nome}")

    # ===== GERAÇÃO SKEW-T =====
    if precisa_Skew:
        df_skew = df.dropna(subset=["pressure", "temp", "humidity"])
        if not df_skew.empty:
            p = df_skew["pressure"].values * units.hPa
            T = df_skew["temp"].values * units.degC
            Td = mpcalc.dewpoint_from_relative_humidity(T, df_skew["humidity"].values / 100.0)

            fig = plt.figure(figsize=(5, 8))
            skew = SkewT(fig, rotation=45)
            skew.plot(p, T, 'r')
            skew.plot(p, Td, 'b')
            plt.title("SkweT", fontsize=16, y=1.04)
            plt.suptitle(subtitulo, fontsize=9, x=0.50, y=0.735)            
            plt.savefig(str(saida_skew_local), dpi=150, bbox_inches="tight")
            shutil.copy(str(saida_skew_local), str(saida_skew_site))
            shutil.copy2(str(saida_skew_local), str(saida_skew_site2))
            plt.close()
            print(f"OK: SkewT -> {nome}")

def main():
    # Iterando sobre os diretórios definidos na lista
    for base_dir in BASE_DIRS:
        print(f"\n[{'-'*40}]")
        print(f"Iniciando busca em: {base_dir}")
        
        # Cria a pasta de gráficos local para este diretório específico
        graf_dir = base_dir / "Graficos"
        os.makedirs(graf_dir, exist_ok=True)
        
        if not base_dir.exists():
            print(f"Aviso: Diretório não encontrado: {base_dir}")
            continue

        # rglob busca em todas as subpastas recursivamente
        for arquivo in base_dir.rglob("*_sonde.log"):
            if "Graficos" in arquivo.parts:
                continue
            # Passando o graf_dir correto para a função
            processa_arquivo(arquivo, graf_dir)

if __name__ == "__main__":
    main()