"""Leitura das bases de entrada e escrita do histórico operacional."""

from __future__ import annotations

from datetime import date, datetime
from pathlib import Path

import pandas as pd

from .utils import clean_columns, normalizar_texto, parse_bool, parse_data, parse_data_hora, read_csv


AERONAVES = ["C98", "C97", "C95"]


def carregar_parametros(base_dir: Path) -> dict:
    default = {
        "data_planejamento": "hoje",
        "criterio_missao": "meta_50",
        "criterio_sbv": "equalizar_quadrinhos",
    }
    path = base_dir / "dados" / "parametros_missao.csv"
    if path.exists():
        df = pd.read_csv(path)
        if {"parametro", "valor"}.issubset(df.columns):
            for _, row in df.iterrows():
                chave = str(row["parametro"]).strip().lower()
                if chave in default:
                    default[chave] = row["valor"]
    default["data_planejamento"] = parse_data(default["data_planejamento"])
    if default["criterio_missao"] == "paop":
        default["criterio_missao"] = "meta_50"
    return default


def carregar_cadastro(base_dir: Path, historico: pd.DataFrame) -> pd.DataFrame:
    local = base_dir / "dados" / "Modelagem_C98_ETA2_local.xlsx"
    original = base_dir / "dados" / "Modelagem C98 ETA2.xlsx"
    arquivo = local if local.exists() else original
    df = clean_columns(pd.read_excel(arquivo, sheet_name="BANCO DE DADOS 2026"))

    resumo = pd.DataFrame(columns=["tripulante", "horas_historico", "sbv_historico"])
    if not historico.empty:
        resumo = (
            historico.groupby("tripulante", as_index=False)
            .agg(horas_historico=("horas_voadas", "sum"), sbv_historico=("sbv", "sum"))
        )

    cadastro = df.rename(
        columns={
            "subprograma_c98": "subprograma_c98",
            "subprograma_c97": "subprograma_c97",
            "subprograma_c95": "subprograma_c95",
        }
    ).copy()
    cadastro["tripulante"] = cadastro["tripulante"].map(normalizar_texto)
    cadastro["qt"] = cadastro["qt"].map(normalizar_texto)
    cadastro["qualificacao"] = cadastro["qualificacao"].map(normalizar_texto)
    for av in AERONAVES:
        cadastro[f"qt_{av.lower()}"] = cadastro["qt"].str.contains(av, na=False)
        cadastro[f"subprograma_{av.lower()}"] = cadastro[f"subprograma_{av.lower()}"].map(normalizar_texto)
        cadastro[f"horas_{av.lower()}"] = pd.to_numeric(cadastro[f"horas_{av.lower()}"], errors="coerce").fillna(0)
    cadastro["soldo"] = pd.to_numeric(cadastro["soldo"], errors="coerce").fillna(0)
    cadastro["horas_totais_2026"] = pd.to_numeric(cadastro["horas_totais_2026"], errors="coerce").fillna(0)
    cadastro = cadastro.merge(resumo, how="left", on="tripulante")
    cadastro["horas_realizadas_2026"] = cadastro["horas_historico"].fillna(0)
    cadastro["sbv_realizados_2026"] = cadastro["sbv_historico"].fillna(0)
    cadastro["disponivel"] = True
    return cadastro.drop(columns=["horas_historico", "sbv_historico"], errors="ignore")


def carregar_catalogo_ois(base_dir: Path) -> pd.DataFrame:
    df = pd.read_excel(base_dir / "dados" / "catalogo_ois.xlsx", sheet_name="catalogo_ois", dtype=str)
    df = df.dropna(subset=["aeronave", "subprograma", "oi"]).copy()
    for col in ["aeronave", "subprograma", "oi", "esforco", "tipo_missao"]:
        df[col] = df[col].map(normalizar_texto)
    df["ordem"] = pd.to_numeric(df["ordem"], errors="coerce")
    df["eh_piloto"] = df.get("eh_piloto", "VERDADEIRO").fillna("VERDADEIRO").map(parse_bool)
    df["conta_hora_voo"] = df["tipo_missao"].isin(["LOCAL", "ROTA"])
    return df[df["eh_piloto"]].sort_values(["aeronave", "subprograma", "ordem"]).reset_index(drop=True)


def carregar_indisponibilidades(base_dir: Path) -> pd.DataFrame:
    path = base_dir / "dados" / "indisponibilidades_2026.xlsx"
    df = pd.read_excel(path)
    df["tripulante"] = df["tripulante"].map(normalizar_texto)
    df["inicio"] = pd.to_datetime(df["inicio"]).dt.date
    df["fim"] = pd.to_datetime(df["fim"]).dt.date
    return df


def carregar_historico(base_dir: Path) -> pd.DataFrame:
    cols = ["data", "aeronave", "tipo_escala", "tripulante", "funcao", "oi", "horas_voadas", "sbv", "origem_registro", "registrado_em"]
    df = read_csv(base_dir / "dados" / "historico_horas_voadas.csv", cols)
    if df.empty:
        return df
    df["data"] = pd.to_datetime(df["data"], errors="coerce").dt.date
    for col in ["aeronave", "tipo_escala", "tripulante", "funcao", "oi"]:
        df[col] = df[col].map(normalizar_texto)
    df["horas_voadas"] = pd.to_numeric(df["horas_voadas"], errors="coerce").fillna(0)
    df["sbv"] = pd.to_numeric(df["sbv"], errors="coerce").fillna(0)
    return df


def carregar_progresso_ois(base_dir: Path) -> pd.DataFrame:
    path = base_dir / "dados" / "progresso_ois_2026.xlsx"
    cols = ["tripulante", "aeronave", "subprograma", "oi", "horas_realizadas", "concluida"]
    if not path.exists():
        return pd.DataFrame(columns=cols)
    df = pd.read_excel(path)
    for col in ["tripulante", "aeronave", "subprograma", "oi"]:
        df[col] = df[col].map(normalizar_texto)
    df["horas_realizadas"] = pd.to_numeric(df["horas_realizadas"], errors="coerce").fillna(0)
    df["concluida"] = df["concluida"].map(parse_bool)
    return df[cols]


def carregar_aeronaves(base_dir: Path) -> pd.DataFrame:
    cols = ["aeronave", "disponivel_sede", "em_pane", "em_missao_rota", "hora_livre"]
    df = read_csv(base_dir / "dados" / "aeronaves_disponiveis.csv", cols)
    if df.empty:
        df = pd.DataFrame({"aeronave": AERONAVES, "disponivel_sede": True, "em_pane": False, "em_missao_rota": False, "hora_livre": "08:00"})
    df["aeronave"] = df["aeronave"].map(normalizar_texto)
    for col in ["disponivel_sede", "em_pane", "em_missao_rota"]:
        df[col] = df[col].map(parse_bool)
    return df


def carregar_tripulantes_disponiveis(base_dir: Path) -> pd.DataFrame:
    df = read_csv(base_dir / "dados" / "tripulantes_disponiveis.csv", ["tripulante", "disponivel"])
    df["tripulante"] = df["tripulante"].map(normalizar_texto)
    df["disponivel"] = df["disponivel"].map(parse_bool)
    return df[df["disponivel"]].reset_index(drop=True)


def carregar_rotas(base_dir: Path) -> pd.DataFrame:
    cols = ["origem", "destino", "inicio", "fim", "tev_horas", "pernoite_dias", "rota"]
    df = read_csv(base_dir / "dados" / "rotas_acionadas.csv", cols)
    if df.empty:
        return df
    for col in ["origem", "destino", "rota"]:
        df[col] = df[col].map(normalizar_texto)
    df["inicio"] = df["inicio"].map(parse_data_hora)
    df["fim"] = df["fim"].map(parse_data_hora)
    df["tev_horas"] = pd.to_numeric(df["tev_horas"], errors="coerce")
    df["pernoite_dias"] = pd.to_numeric(df["pernoite_dias"], errors="coerce").fillna((df["fim"] - df["inicio"]).dt.days).fillna(0)
    df["duracao_horas"] = (df["fim"] - df["inicio"]).dt.total_seconds() / 3600
    return df.dropna(subset=["origem", "destino"], how="all").reset_index(drop=True)


def salvar_historico(base_dir: Path, registros: pd.DataFrame) -> None:
    path = base_dir / "dados" / "historico_horas_voadas.csv"
    historico = carregar_historico(base_dir)
    atualizado = pd.concat([historico, registros], ignore_index=True)
    atualizado.to_csv(path, index=False)
