"""Registro de horas e geração do relatório Excel final."""

from __future__ import annotations

from datetime import datetime
from pathlib import Path

import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Alignment, Font, PatternFill, Border, Side
from openpyxl.utils.dataframe import dataframe_to_rows

from .utils import parse_horas


def horas_previstas(linha: pd.Series, catalogo: pd.DataFrame) -> float:
    if linha["tipo_escala"] == "SBV":
        return 0.0
    horas = parse_horas(linha.get("tev_horas"))
    if horas:
        return horas
    oi = linha.get("oi_trip1", "")
    match = catalogo[(catalogo["aeronave"] == linha["aeronave"]) & (catalogo["oi"] == oi)]
    if not match.empty and bool(match.iloc[0]["conta_hora_voo"]):
        return parse_horas(match.iloc[0]["tev_horas"]) or 0.0
    return 0.0


def gerar_registros(solucao: pd.DataFrame, catalogo: pd.DataFrame) -> pd.DataFrame:
    linhas = []
    agora = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    for _, row in solucao.iterrows():
        horas = horas_previstas(row, catalogo)
        sbv = 1 if row["tipo_escala"] == "SBV" else 0
        for funcao, trip, oi in [("TRIP1", row["trip1"], row.get("oi_trip1", "")), ("TRIP2", row["trip2"], row.get("oi_trip2", ""))]:
            linhas.append(
                {
                    "data": row["data"],
                    "aeronave": row["aeronave"],
                    "tipo_escala": row["tipo_escala"],
                    "tripulante": trip,
                    "funcao": funcao,
                    "oi": oi if isinstance(oi, str) else "",
                    "horas_voadas": horas,
                    "sbv": sbv,
                    "origem_registro": "escala_diaria",
                    "registrado_em": agora,
                }
            )
    return pd.DataFrame(linhas)


def bloco(solucao: pd.DataFrame, tipo: str) -> pd.DataFrame:
    dados = solucao[solucao["tipo_escala"] == tipo]
    if dados.empty:
        return pd.DataFrame([{"AERONAVE": "-", "TRIP 1": "-", "TRIP 2": "-", "OI/FICHA": "-", "DETALHE": "Sem escala"}])
    detalhe = dados["observacao"]
    if tipo == "ROTA_ACIONADA":
        detalhe = dados["rota"].where(dados["rota"].astype(str) != "", dados["origem"] + " - " + dados["destino"])
    return pd.DataFrame(
        {
            "AERONAVE": dados["aeronave"],
            "TRIP 1": dados["trip1"],
            "TRIP 2": dados["trip2"],
            "OI/FICHA": dados["oi_trip1"].replace("", "-"),
            "DETALHE": detalhe,
        }
    )


def escrever_tabela(ws, titulo: str, dados: pd.DataFrame, row: int, col: int, cor: str) -> None:
    fill_titulo = PatternFill("solid", fgColor=cor)
    fill_header = PatternFill("solid", fgColor="D9EAF7")
    borda = Border(*(Side(style="thin", color="BFBFBF") for _ in range(4)))
    ws.merge_cells(start_row=row, start_column=col, end_row=row, end_column=col + 4)
    cell = ws.cell(row=row, column=col, value=titulo)
    cell.fill = fill_titulo
    cell.font = Font(color="FFFFFF", bold=True)
    cell.alignment = Alignment(horizontal="center")
    for r_idx, linha in enumerate(dataframe_to_rows(dados, index=False, header=True), row + 1):
        for c_idx, valor in enumerate(linha, col):
            c = ws.cell(row=r_idx, column=c_idx, value=valor)
            c.border = borda
            c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
            if r_idx == row + 1:
                c.fill = fill_header
                c.font = Font(bold=True)


def gerar_excel(base_dir: Path, data_planejamento, solucao: pd.DataFrame) -> Path:
    out_dir = base_dir / "resultados"
    out_dir.mkdir(exist_ok=True)
    arquivo = out_dir / f"planejamento_diario_{data_planejamento}.xlsx"
    if arquivo.exists():
        arquivo = out_dir / f"planejamento_diario_{data_planejamento}_{datetime.now():%H%M%S}.xlsx"

    wb = Workbook()
    ws = wb.active
    ws.title = "ESCALA DIARIA"
    ws.merge_cells("A1:Q1")
    ws["A1"] = "Planejador diario de missoes e sobreaviso - 2 ETA"
    ws["A1"].fill = PatternFill("solid", fgColor="1F4E78")
    ws["A1"].font = Font(color="FFFFFF", bold=True, size=16)
    ws["A1"].alignment = Alignment(horizontal="center")
    ws.merge_cells("A2:Q2")
    ws["A2"] = f"ESCALA DIARIA - {data_planejamento:%d/%m/%Y}"
    ws["A2"].font = Font(color="1F4E78", bold=True, size=18)
    ws["A2"].alignment = Alignment(horizontal="center")

    escrever_tabela(ws, "MISSÃO ACIONADA", bloco(solucao, "ROTA_ACIONADA"), 5, 1, "C00000")
    escrever_tabela(ws, "VOOS LOCAIS", bloco(solucao, "MISSAO_LOCAL"), 5, 7, "548235")
    escrever_tabela(ws, "SOBREAVISO", bloco(solucao, "SBV"), 5, 13, "8064A2")
    for col in range(1, 18):
        ws.column_dimensions[chr(64 + col)].width = 14 if col not in {5, 11, 17} else 24
    ws.freeze_panes = "A5"
    wb.save(arquivo)
    return arquivo
