"""Fluxo principal do planejador em Python."""

from __future__ import annotations

from pathlib import Path

from .candidates import gerar_colunas
from .data_io import (
    carregar_aeronaves,
    carregar_cadastro,
    carregar_catalogo_ois,
    carregar_historico,
    carregar_indisponibilidades,
    carregar_parametros,
    carregar_progresso_ois,
    carregar_rotas,
    carregar_tripulantes_disponiveis,
    salvar_historico,
)
from .optimizer import resolver_milp
from .report import gerar_excel, gerar_registros
from .rules import combinar_progresso_com_historico


def executar_planejamento(base_dir: Path) -> dict:
    # Bloco 01 - Entrada e estado operacional.
    parametros = carregar_parametros(base_dir)
    historico = carregar_historico(base_dir)
    cadastro = carregar_cadastro(base_dir, historico)
    catalogo = carregar_catalogo_ois(base_dir)
    indisponibilidades = carregar_indisponibilidades(base_dir)
    progresso = combinar_progresso_com_historico(carregar_progresso_ois(base_dir), historico, catalogo)
    aeronaves = carregar_aeronaves(base_dir)
    disponiveis = carregar_tripulantes_disponiveis(base_dir)
    rotas = carregar_rotas(base_dir)

    # Bloco 02 - Geracao das colunas candidatas.
    colunas = gerar_colunas(
        parametros["data_planejamento"],
        rotas,
        aeronaves,
        cadastro,
        indisponibilidades,
        progresso,
        catalogo,
        disponiveis,
        parametros["criterio_missao"],
        parametros["criterio_sbv"],
    )

    # Bloco 03 - Modelo MILP e selecao final.
    solucao = resolver_milp(colunas, rotas, aeronaves)

    # Bloco 04 - Persistência operacional e relatório.
    registros = gerar_registros(solucao, catalogo)
    salvar_historico(base_dir, registros)
    arquivo_saida = gerar_excel(base_dir, parametros["data_planejamento"], solucao)

    return {
        "data_planejamento": parametros["data_planejamento"],
        "arquivo_saida": arquivo_saida,
        "total_candidatas": len(colunas),
        "total_selecionadas": len(solucao),
    }
