"""Resumo operacional por tripulante para a aba de quadrinhos."""

from __future__ import annotations

from pathlib import Path

import pandas as pd

from .candidates import proxima_oi
from .data_io import AERONAVES, carregar_cadastro, carregar_catalogo_ois, carregar_historico, carregar_progresso_ois
from .rules import combinar_progresso_com_historico, qualificacao_operacional
from .utils import normalizar_texto


def carregar_quadrinho_manual(base_dir: Path) -> pd.DataFrame:
    path = base_dir / "dados" / "quadrinho_operacional_manual.csv"
    cols = [
        "tripulante",
        "aeronave",
        "qualificacao_manual",
        "horas_voadas_manual",
        "sbv_manual",
        "ultima_data_voo_manual",
        "observacao",
    ]
    if not path.exists():
        return pd.DataFrame(columns=cols)
    df = pd.read_csv(path)
    for col in cols:
        if col not in df.columns:
            df[col] = pd.NA
    df = df[cols].copy()
    df["tripulante"] = df["tripulante"].map(normalizar_texto)
    df["aeronave"] = df["aeronave"].map(normalizar_texto)
    df["horas_voadas_manual"] = pd.to_numeric(df["horas_voadas_manual"], errors="coerce").fillna(0)
    df["sbv_manual"] = pd.to_numeric(df["sbv_manual"], errors="coerce").fillna(0)
    return df


def gerar_quadrinhos(base_dir: Path) -> pd.DataFrame:
    historico = carregar_historico(base_dir)
    cadastro = carregar_cadastro(base_dir, historico)
    catalogo = carregar_catalogo_ois(base_dir)
    progresso = combinar_progresso_com_historico(carregar_progresso_ois(base_dir), historico, catalogo)
    manual = carregar_quadrinho_manual(base_dir)

    linhas = []
    for _, trip in cadastro.sort_values("tripulante").iterrows():
        trigrama = trip["tripulante"]
        sbv_hist = float(trip.get("sbv_realizados_2026", 0) or 0)
        horas_hist = float(trip.get("horas_realizadas_2026", 0) or 0)
        for av in AERONAVES:
            if not bool(trip.get(f"qt_{av.lower()}", False)):
                continue
            manual_row = manual[(manual["tripulante"] == trigrama) & (manual["aeronave"] == av)]
            horas_manual = 0.0 if manual_row.empty else float(manual_row.iloc[0].get("horas_voadas_manual", 0) or 0)
            sbv_manual = 0.0 if manual_row.empty else float(manual_row.iloc[0].get("sbv_manual", 0) or 0)
            qual_manual = "" if manual_row.empty else normalizar_texto(manual_row.iloc[0].get("qualificacao_manual", ""))
            obs = "" if manual_row.empty else str(manual_row.iloc[0].get("observacao", "") or "")
            ultima_manual = "" if manual_row.empty else str(manual_row.iloc[0].get("ultima_data_voo_manual", "") or "")

            proximas = []
            subprogramas = [sp for sp in str(trip.get(f"subprograma_{av.lower()}", "")).split() if sp.startswith("SP")]
            for sp in subprogramas:
                oi = proxima_oi(trigrama, av, sp, progresso, catalogo)
                if oi:
                    proximas.append(f"{sp}: {oi['oi']}")
                else:
                    proximas.append(f"{sp}: concluido")

            voos_trip = historico[(historico["tripulante"] == trigrama) & (historico["aeronave"] == av) & (historico["horas_voadas"] > 0)]
            ultima_hist = "" if voos_trip.empty else max(voos_trip["data"]).isoformat()

            linhas.append(
                {
                    "tripulante": trigrama,
                    "aeronave": av,
                    "qualificacao": qual_manual or qualificacao_operacional(trigrama, av, cadastro, progresso, catalogo),
                    "proxima_oi": " | ".join(proximas) if proximas else "-",
                    "horas_aeronave_base": float(trip.get(f"horas_{av.lower()}", 0) or 0),
                    "horas_voadas_ano": horas_hist + horas_manual,
                    "sbv_ano": sbv_hist + sbv_manual,
                    "ultima_data_voo": ultima_manual or ultima_hist,
                    "meta_50_faltante": max(0.0, 50.0 - (horas_hist + horas_manual)),
                    "observacao": obs,
                }
            )
    return pd.DataFrame(linhas)


def quadrinhos_para_api(base_dir: Path) -> dict:
    df = gerar_quadrinhos(base_dir)
    if df.empty:
        return {"linhas": [], "resumo": {"tripulantes": 0, "abaixo_50": 0, "horas_media": 0}}
    resumo = {
        "tripulantes": int(df["tripulante"].nunique()),
        "abaixo_50": int((df["horas_voadas_ano"] < 50).sum()),
        "horas_media": round(float(df["horas_voadas_ano"].mean()), 1),
    }
    return {"linhas": df.fillna("").to_dict(orient="records"), "resumo": resumo}
