"""
PMBOK 8 Together: menu de execucao dos 40 PROCESSOS.

PROCESSO, NAO "ETAPA" (Eduardo, 14/08/2026)
    Project Together = 10 PASSOS (do metodo) · PMBOK 8 Together = 40 PROCESSOS (do Guia).
    A palavra que aparece na tela vem do catalogo (`unidade`), nunca escrita a mao aqui.

Como abrir:
  - Windows: clique duas vezes em  Iniciar.bat
  - Mac:     clique com o botao direito em  Iniciar.command  -> Abrir
  - Ou, no terminal:  python menu.py

O RITMO DO CURSO (o mesmo em todo processo):
  1. rode o processo  ->  ele te devolve o prompt PRONTO (na area de transferencia)
  2. cole o prompt na sua IA (Ctrl+V)
  3. cole a resposta INTEIRA dela no cartao "0. Caixa de entrada" do seu quadro
  4. rode o processo DE NOVO  ->  ele le o quadro e escreve o seu documento
Voce nunca edita arquivo nenhum. Quem le o quadro e' o script.

POR QUE ESTE MENU E' DIRIGIDO POR DADO
    Os 10 passos do Project Together sao 10 scripts, e o menu deles e' uma lista escrita
    a mao. Para 40 isso nao escala — e nem precisa: cada um dos 40 E' um processo do Guia
    PMBOK 8, e `catalogo_pmbok8.json` ja' diz o dominio, a area de foco, as saidas e o
    gerador de cada um. O menu abaixo LE o catalogo. Um processo novo aparece aqui
    sozinho, sem ninguem editar este arquivo.
"""
import os
import subprocess
import sys

import catalogo_pmbok8 as cat
from idioma import T, Tf

try:
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")
except Exception:
    pass

HERE = os.path.dirname(os.path.abspath(__file__))
CURRICULO = cat.CURRICULO_40

# Declara o curso ANTES de tudo: quem imprime rotulo, quem carimba documento e quem roda
# um script em subprocesso leem esta declaracao (ver catalogo_pmbok8.curriculo_corrente).
cat.definir_curriculo(CURRICULO)
TOTAL = cat.total(CURRICULO)

# As TECLAS que nao sao numero de processo. Sao as mesmas do Project Together, de proposito:
# quem vem de la' nao reaprende nada (Eduardo, 13/08/2026 — "tudo de bom que ja existe no
# Project Together tem que ser incorporado").
ITENS = [
    ("0",  T("Atualizar a versão do curso"),                   "update.py"),
    ("A",  T("Escolher a abordagem (o COMO do processo 1) · 5 perguntas, você decide"),
                                                               "01a_escolher_abordagem.py"),
    ("D",  T("Gerar os meus documentos — todos os que o quadro já permite"),
                                                               "gerar_documentos.py"),
    ("C",  T("Consolidar respostas de diferentes IA — cole 2 com o mesmo rótulo"),
                                                               "consolidar.py"),
    ("R",  T("Recalcular o plano — ajustei o quadro; refaça as contas e os documentos"),
                                                               "recalcular.py"),
    ("E",  T("Engenharia reversa — o quadro mudou; atualize o meu Termo de Abertura"),
                                                               "reverse_engineering.py"),
    ("P",  T("Verificar o meu PROJETO — como está a saúde e o que faço agora?"),
                                                               "verificar_projeto.py"),
    ("K",  T("Verificar os meus OKRs — o projeto ainda alcança o que prometi?"),
                                                               "verificar_okrs.py"),
    ("Z",  T("Zerar um processo — apaga o que ele criou (mostra antes e pergunta)"),
                                                               "reset.py"),
]

_MARCA = {"OK": "●", "..": "○", "!!": "!", "--": "–"}


def _abordagem():
    try:
        from env import cfg
        a = (cfg().get("APPROACH") or "").strip().upper()
        return a if a in ("PREDITIVA", "AGIL") else ""
    except Exception:
        return ""


def _estado_do_processo(e, todos):
    """(marca, quantos_geram, quantas_saidas) — o que dizer deste processo no menu."""
    saidas = e.get("artefatos") or []
    if not saidas:
        return "--", 0, 0
    geram = sum(1 for n in saidas if todos[n].get("gerador"))
    if geram == len(saidas):
        return "OK", geram, len(saidas)
    if geram:
        return "OK", geram, len(saidas)
    return "..", 0, len(saidas)


def _painel():
    try:
        from env import cfg
        c = cfg()
        projeto = (c.get("PROJECT") or "").strip()
        board = (c.get("BOARD_ID") or "").strip()
    except Exception:
        projeto = board = ""
    ab = _abordagem()
    if projeto:
        print(Tf("  Projeto: {0}", projeto)
              + (Tf("  ·  quadro {0}", board) if board else "")
              + (Tf("  ·  abordagem {0}", ab) if ab else Tf("  ·  {0}", T("abordagem: rode a tecla A"))))


def _rodar(arquivo, *args):
    caminho = os.path.join(HERE, arquivo)
    if not os.path.exists(caminho):
        print(Tf('\n [!] Não encontrei {0} nesta pasta. Você extraiu o curso direto aqui?\n',
                 arquivo))
        return
    print(Tf("\n>>> Rodando {0} ...\n", arquivo) + "-" * 62)
    subprocess.run([sys.executable, caminho, *args], cwd=HERE)
    print("-" * 62)
    input(T("\nEnter para voltar ao menu..."))


def _listar_processos():
    processos = cat.unidades(CURRICULO)
    todos = cat.carregar()["artefatos"]
    area = None
    for n in sorted(processos, key=int):
        e = processos[n]
        if e.get("area_foco") != area:
            area = e.get("area_foco")
            print(f"\n   ── {area} " + "─" * max(0, 46 - len(str(area))))
        marca, geram, total = _estado_do_processo(e, todos)
        sufixo = ""
        if marca == "OK" and total:
            sufixo = Tf("  ({0}/{1} documentos)", geram, total)
        elif marca == "..":
            sufixo = T("  (em breve)")
        elif marca == "--":
            sufixo = T("  (nova versão de um documento seu)")
        print(f"   {_MARCA[marca]} {int(n):>2}. {e['rotulo'][:42]:44}{sufixo}")


def menu():
    por_tecla = {t.lower(): (t, r, a) for t, r, a in ITENS}
    while True:
        print("\n" + "=" * 66)
        print(Tf("  {0} · {1} {2} — o que você quer rodar?", cat.nome_curso(CURRICULO),
                 TOTAL, cat.unidade(CURRICULO, plural=True)))
        print("=" * 66)
        _painel()
        _listar_processos()
        print("\n   " + "─" * 52)
        for tecla, rotulo, arquivo in ITENS:
            existe = os.path.exists(os.path.join(HERE, arquivo))
            print(f"   {tecla:>2}. {rotulo}" + ("" if existe else T("  ·  (em breve)")))
        print(f"   {'S':>2}. " + T("Sair"))
        print(T("\n   ● gera documento   ○ em breve   – nova versão de um documento seu"))

        escolha = input(T("\nDigite o nº do processo (ou 1-6 para rodar uma sequência), "
                          "uma letra, ou S para sair: ")).strip().lower()
        if escolha in ("s", "sair", "q", "x"):
            print(T("Até logo!"))
            return
        if not escolha:
            continue
        # processo (ou intervalo): quem manda e' o processo.py, dirigido pelo catalogo
        alvo = escolha.replace(" ", "")
        if alvo.replace("-", "").isdigit():
            _rodar("processo.py", alvo)
            continue
        item = por_tecla.get(escolha)
        if not item:
            print(Tf("Opção inválida — digite o número de um processo (1 a {0}), um "
                     "intervalo (ex.: 1-6), uma das letras acima, ou S.", TOTAL))
            continue
        _tecla, rotulo, arquivo = item
        if not os.path.exists(os.path.join(HERE, arquivo)):
            print(Tf('\n  "{0}" ainda não saiu — chega numa próxima versão do pacote.', rotulo))
            print(T("  Rode a opção 0 (\"Atualizar a versão do curso\") de vez em quando.\n"))
            input(T("Enter para voltar ao menu..."))
            continue
        _rodar(arquivo)


if __name__ == "__main__":
    try:
        menu()
    except (KeyboardInterrupt, EOFError):
        print("\n" + T("Até logo!"))
