from pathlib import Path
from PIL import Image, ImageDraw, ImageFont
from datetime import datetime
import sys

# ===================================================================
# CONFIGURAÇÕES PRINCIPAIS E FLAG DE ATUALIZAÇÃO
# ===================================================================

# FLAG de Figuras de Histórico (FS_*.png):
# True = Sobrescreve/Atualiza todas as imagens de histórico sempre.
# False = Gera a imagem de histórico APENAS se ela ainda não existir na pasta.
atualizar_figuras_fs = False 

# Captura o horário exato em que o programa rodou
horario_atualizacao = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
texto_rodape_dir = f"Last updated: {horario_atualizacao}"
texto_rodape_esq = " " # "Imagem gerada automaticamente a partir do conteúdo do arquivo"

# -------------------------------------------------------------------
# Caminhos
# -------------------------------------------------------------------
arquivo_txt = Path(r"I:\Meu Drive\PMs\Sondagens\FlightStatus.txt")

# Se for rodar localmente no seu Windows, use o seu caminho padrão
pasta_saida = Path(r"D:\Site\labmicro\Data\Radiossonda\FlightStatus")
arquivo_tabela = pasta_saida / "FlightStatus_table.png"
arquivo_flight_status = pasta_saida / "FlightStatus.png"

if not arquivo_txt.exists():
    raise FileNotFoundError(f"Arquivo não encontrado: {arquivo_txt}")

pasta_saida.mkdir(parents=True, exist_ok=True)

# ===================================================================
# CHECAGEM INTELIGENTE DE ATUALIZAÇÃO DO ARQUIVO TXT
# ===================================================================
if arquivo_flight_status.exists():
    tempo_modificacao_txt = arquivo_txt.stat().st_mtime
    tempo_modificacao_png = arquivo_flight_status.stat().st_mtime
    
    # Se o TXT for mais antigo ou tiver a exata mesma idade que o PNG, não houve mudança.
    if tempo_modificacao_txt <= tempo_modificacao_png:
        print("Nenhuma nova linha/alteração detectada no FlightStatus.txt.")
        print("Atualização ignorada para poupar processamento.")
        sys.exit(0)  # Encerra o script imediatamente aqui!

print("Novos dados detectados no arquivo TXT! Iniciando processamento...")

# -------------------------------------------------------------------
# Leitura e separação de blocos
# -------------------------------------------------------------------
conteudo = arquivo_txt.read_text(encoding="utf-8").strip()
todas_linhas = [l for l in conteudo.splitlines() if l.strip()]

registos = []
bloco = []
for linha in todas_linhas:
    if (linha.startswith("Model:") or linha.startswith("Modelo:")) and bloco:
        registos.append(bloco)
        bloco = [linha]
    else:
        bloco.append(linha)
if bloco: 
    registos.append(bloco)

rotulos_unificados = {
    "Modelo": "Model",
    "Model": "Model",
    "NS": "Serial Number",
    "SN": "Serial Number",
    "Local": "Launch site",
    "Site": "Launch site",
    "Data": "Date",
    "Date": "Date",
    "Horário de lançamento": "Time",
    "Launch Time": "Time",
    "Time": "Time",
    "Operator":"Operador",
    "Operador":"Operador",
    "Radiossonda calibrada": "Calibration check",
    "Calibration check": "Calibration check",
    "Tower notified": "Cindact notified",
    "Torre avisada": "Cindact notified",
    "Air Temperature":"Air Temperature",
    "Relative Humidity":"Relative Humidity",
    "Air pressure":"Air pressure",
    "Wind speed":"Wind speed",
    "Wind direction":"Wind direction",
    "Cloud cover":"Cloud cover",
    "Cloud type": "Cloud type",
    "OBS": "OBS"
}

# -------------------------------------------------------------------
# Configuração gráfica
# -------------------------------------------------------------------
cor_fundo = (245, 248, 250)
cor_texto = (30, 40, 55)
cor_titulo = (10, 60, 110)
cor_linha = (120, 140, 160)
cor_rodape = (130, 140, 150)

try:
    fonte_titulo = ImageFont.truetype("arialbd.ttf", 32)
    fonte_texto = ImageFont.truetype("arial.ttf", 20)
    fonte_pequena = ImageFont.truetype("arial.ttf", 16)
except OSError:
    print("Aviso: Fonte Arial não encontrada. Usando fonte padrão.")
    fonte_titulo = ImageFont.load_default()
    fonte_texto = ImageFont.load_default()
    fonte_pequena = ImageFont.load_default()

# -------------------------------------------------------------------
# 1) Gerar imagens e extrair dados para a Tabela
# -------------------------------------------------------------------
dados_tabela = []
imagens_fs_ignoradas = 0

for i, bloco in enumerate(registos):
    data_tab = "unavailable"
    hora_tab = "unavailable"
    comm_tab = "unavailable"
    linhas_fmt = []
    
    for linha in bloco:
        if ":" in linha:
            campo, valor = linha.split(":", 1)
            campo = campo.strip()
            valor = valor.strip()
            
            if campo in ["Data", "Date"]:
                data_tab = valor
            elif campo in ["Horário de lançamento", "Time"]:
                hora_tab = valor
            elif campo in ["Torre avisada", "Tower notified", "Communication check"]:
                comm_tab = valor
            
            novo_campo = rotulos_unificados.get(campo, campo)
            linhas_fmt.append(f"{novo_campo}: {valor}")
        else:
            linhas_fmt.append(linha)
            
    dados_tabela.append((data_tab, hora_tab, comm_tab))

# ===================================================================
    # NOVA LÓGICA DE AGRUPAMENTO (DUAS COLUNAS PARA O CLIMA)
    # ===================================================================
    linhas_desenho = []
    x_col1 = 120
    x_col2 = 440  # Distância da segunda coluna
    
    i_linha = 0
    while i_linha < len(linhas_fmt):
        linha = linhas_fmt[i_linha]
        linha_lower = linha.lower()
        
        # 1. Temperatura e Umidade (mesma linha)
        if "temperature" in linha_lower and i_linha + 1 < len(linhas_fmt) and "humidity" in linhas_fmt[i_linha+1].lower():
            linhas_desenho.append([(linha, x_col1), (linhas_fmt[i_linha+1], x_col2)])
            i_linha += 2
            
        # 2. Vento: Velocidade e Direção (mesma linha)
        elif "wind speed" in linha_lower and i_linha + 1 < len(linhas_fmt) and "wind direction" in linhas_fmt[i_linha+1].lower():
            linhas_desenho.append([(linha, x_col1), (linhas_fmt[i_linha+1], x_col2)])
            i_linha += 2
            
        # 3. Nuvens: Cobertura e Tipo (mesma linha)
        elif "cloud cover" in linha_lower and i_linha + 1 < len(linhas_fmt) and "cloud type" in linhas_fmt[i_linha+1].lower():
            linhas_desenho.append([(linha, x_col1), (linhas_fmt[i_linha+1], x_col2)])
            i_linha += 2
            
        # As demais linhas ficam normais (sozinhas e na primeira coluna)
        else:
            linhas_desenho.append([(linha, x_col1)])
            i_linha += 1
            
    str_data = data_tab.replace("/", "") if data_tab != "unavailable" else "00000000"
    str_hora = hora_tab.replace("h", "").replace(":", "") if hora_tab != "unavailable" else "0000"
    nome_arquivo_fs = f"FS_{str_data}_{str_hora}.png"
    arquivo_status_fs = pasta_saida / nome_arquivo_fs

    # ======= A LÓGICA DE GERAÇÃO =======
    # Precisa gerar o arquivo FS? (Sim, se a flag for True OU se o arquivo não existir)
    precisa_gerar_fs = atualizar_figuras_fs or (not arquivo_status_fs.exists())
    
    # Precisa desenhar a imagem na memória? (Sim, se for o 1º bloco OU se precisar gerar o arquivo FS)
    precisa_desenhar_imagem = (i == 0) or precisa_gerar_fs

    if precisa_desenhar_imagem:
        largura, altura = 1200, 900
        img = Image.new("RGB", (largura, altura), cor_fundo)
        draw = ImageDraw.Draw(img)

        margem = 40
        draw.rounded_rectangle(
            (margem, margem, largura - margem, altura - margem),
            radius=20, outline=cor_linha, width=3, fill=(255, 255, 255)
        )

        titulo = "Status of the last balloon flight"
        draw.text((80, 80), titulo, fill=cor_titulo, font=fonte_titulo)
        draw.line((80, 130, largura - 80, 130), fill=cor_linha, width=2)

        # DESENHA A MARCA D'ÁGUA ANTES DO TEXTO (Evita sobreposição)
        cor_sonda_watermark = (230, 235, 240)
        cor_detalhe_watermark = (240, 210, 210)
        x0, y0 = 620, 170

        draw.ellipse((x0, y0, x0 + 280, y0 + 260), outline=cor_detalhe_watermark, width=6, fill=(252, 247, 247))
        draw.line((x0 + 140, y0 + 260, x0 + 140, y0 + 285), fill=cor_detalhe_watermark, width=6)
        draw.line((x0 + 140, y0 + 285, x0 + 140, y0 + 380), fill=cor_sonda_watermark, width=6)

        caixa_top, caixa_bottom = y0 + 380, y0 + 450
        caixa_left, caixa_right = x0 + 105, x0 + 175

        draw.rounded_rectangle((caixa_left, caixa_top, caixa_right, caixa_bottom), radius=10, outline=cor_sonda_watermark, width=4, fill=(245, 248, 250))
        draw.line((caixa_left + 10, caixa_top + 18, caixa_right - 10, caixa_top + 18), fill=cor_sonda_watermark, width=4)
        draw.line((caixa_left + 10, caixa_top + 35, caixa_right - 10, caixa_top + 35), fill=cor_sonda_watermark, width=4)
        draw.ellipse((x0 + 130, caixa_bottom - 6, x0 + 150, caixa_bottom + 14), outline=cor_detalhe_watermark, width=4)
        draw.line((x0 + 140, caixa_bottom + 14, x0 + 140, caixa_bottom + 38), fill=cor_sonda_watermark, width=4)

        # DESENHO DOS TEXTOS COM DUAS COLUNAS
        y_texto, espacamento = 170, 45
        for j, itens_linha in enumerate(linhas_desenho):
            # itens_linha pode conter 1 ou 2 textos dependendo se foi agrupado ou não
            for texto, x_pos in itens_linha:
                draw.text((x_pos, y_texto + j * espacamento), texto, fill=cor_texto, font=fonte_texto)

        draw.text((80, altura - 75), texto_rodape_esq, fill=cor_rodape, font=fonte_pequena)
        draw.text((largura - 380, altura - 75), texto_rodape_dir, fill=cor_rodape, font=fonte_pequena)

        # 1. SEMPRE atualiza a imagem principal (FlightStatus.png)
        # ... [continua o código original]

        # 1. SEMPRE atualiza a imagem principal (FlightStatus.png)
        if i == 0:
            img.save(arquivo_flight_status)
            print("Imagem principal atualizada: FlightStatus.png")
            
        # 2. Salva o arquivo FS se ele passou no critério de geração
        if precisa_gerar_fs:
            img.save(arquivo_status_fs)
            print(f"Nova imagem de histórico criada/atualizada: {nome_arquivo_fs}")
    else:
        imagens_fs_ignoradas += 1

if imagens_fs_ignoradas > 0:
    print(f"[{imagens_fs_ignoradas} imagens FS foram ignoradas pois já existiam e a atualização foi bloqueada pela flag]")

# -------------------------------------------------------------------
# 2) Gerar FlightStatus_table.png (Tabela)
# -------------------------------------------------------------------
largura_tab = 1200
topo, cabecalho, altura_linha, rodape, margem = 80, 70, 40, 70, 40
n_linhas = len(dados_tabela)

altura_tab = margem + topo + cabecalho + (n_linhas * altura_linha) + rodape + margem

img_tab = Image.new("RGB", (largura_tab, altura_tab), cor_fundo)
draw_tab = ImageDraw.Draw(img_tab)

draw_tab.rounded_rectangle(
    (margem, margem, largura_tab - margem, altura_tab - margem),
    radius=20, outline=cor_linha, width=3, fill=(255, 255, 255)
)

titulo_tab = "Balloon flights summary"
draw_tab.text((80, 80), titulo_tab, fill=cor_titulo, font=fonte_titulo)
draw_tab.line((80, 130, largura_tab - 80, 130), fill=cor_linha, width=2)

x_data, x_time, x_comm = 100, 380, 600
y_head = 160

draw_tab.text((x_data, y_head), "Date", fill=cor_texto, font=fonte_texto)
draw_tab.text((x_time, y_head), "Time", fill=cor_texto, font=fonte_texto)
draw_tab.text((x_comm, y_head), "Cindact notified", fill=cor_texto, font=fonte_texto)

draw_tab.line((80, y_head + 35, largura_tab - 80, y_head + 35), fill=cor_linha, width=2)

y_linha = y_head + 50
for data, hora, comm in dados_tabela:
    draw_tab.text((x_data, y_linha), data, fill=cor_texto, font=fonte_texto)
    draw_tab.text((x_time, y_linha), hora, fill=cor_texto, font=fonte_texto)
    draw_tab.text((x_comm, y_linha), comm, fill=cor_texto, font=fonte_texto)
    y_linha += altura_linha

draw_tab.text((largura_tab - 380, altura_tab - 75), texto_rodape_dir, fill=cor_rodape, font=fonte_pequena)

img_tab.save(arquivo_tabela)
print(f"Tabela gerada: FlightStatus_table.png com {n_linhas} registros.")