# -*- coding: utf-8 -*-
"""
Agile Together — Meta do Produto + Product Backlog.

Voce NAO edita este arquivo. O ciclo e' sempre o mesmo:
  1. rode este passo   -> ele entrega o prompt (area de transferencia + tela)
  2. cole na sua IA    -> ela responde
  3. cole a resposta no cartao "0. Caixa de entrada" do seu quadro
  4. rode este passo de novo -> ele le o quadro e cria os cartoes

Rodar duas vezes e' seguro: enquanto nao houver resposta no cartao, ele so'
devolve o prompt. Os itens sao reconhecidos pelo TITULO — refazer o passo
atualiza o que ja' existe em vez de duplicar.
"""
import caixa
import entradas
import pa_client
import prompts
from agile_together import cfg, create_card, get_cards, update_card
from runner import header, step, ok, warn, done
from idioma import T, Tf

c = cfg()
objetivo = (c.get('OBJETIVO') or '').strip()
if not objetivo or objetivo.upper().startswith('ESCREVA'):
    raise SystemExit(
        T("ERRO: escolha o passo 1 do menu (Configurar o quadro) antes deste.\n"
        "      E' ele que pergunta o seu OBJETIVO — a primeira acao pratica do\n"
        "      curso (P1). A direcao e' sua, e o backlog inteiro e' ordenado\n"
        "      contra ela. Voce nao precisa abrir arquivo nenhum.")
    )

total = c.get('TOTAL_SPRINTS', 3)
software = str(c.get('TIPO_PROJETO', '')).strip().lower().startswith('soft')

secoes = caixa.ler(
    ["META DO PRODUTO", "HISTORIAS"],
    T("Meta do Produto + Product Backlog"),
    prompts.backlog(objetivo, total, software=software),
    obrigatorias=["HISTORIAS"],
)

meta = (caixa.valor(secoes, "META DO PRODUTO")
        or entradas.meta_produto(secoes.get("_bruto", "")))
itens = entradas.backlog(caixa.secao(secoes, "HISTORIAS"))
if not itens:
    raise SystemExit(T("A secao HISTORIAS veio vazia. Peca a lista de novo a sua IA."))

header(Tf("Product Backlog — {0} itens", len(itens)))

existentes = {(cd.get('titulo') or '').strip().lower(): cd
              for cd in get_cards('product_backlog')}

# 1) A Meta do Produto — o compromisso do Product Backlog (Guia do Scrum).
#    Sem ela o backlog e' uma lista de desejos: nao ha' contra o que ordenar.
if meta:
    titulo_meta = Tf("META DO PRODUTO: {0}", meta)
    # A meta INTEIRA vai na descricao, sempre. O titulo e' capado em 250 caracteres
    # (limite da API), e este e' justamente o cartao que nao pode perder o final: e'
    # contra ele que o backlog inteiro e' ordenado. Assim nada se perde — e o cartao
    # nasce mesmo quando a IA devolve uma meta longa demais.
    antiga = next((cd for t, cd in existentes.items()
                   if t.startswith("meta do produto") or "meta do produto:" in t), None)
    if antiga:
        update_card(antiga['id'], titulo=titulo_meta, descricao=meta)
        ok(Tf("atualizada  {0}", titulo_meta[:66]))
    else:
        create_card('product_backlog', titulo_meta, meta)
        ok(Tf("criada      {0}", titulo_meta[:66]))
    if len(titulo_meta) > pa_client.PA_TITULO_MAX:
        warn(Tf("a sua META DO PRODUTO tem {0} caracteres — o TITULO do cartao mostra os "
                "primeiros {1}.", len(meta), pa_client.PA_TITULO_MAX))
        print(T("  Ela esta' INTEIRA na descricao do cartao: nada se perdeu."))
        print(T("  Mas vale reescreve-la: pelo Guia do Scrum a Meta do Produto e' o"))
        print(T("  compromisso do Product Backlog — uma frase que se decora, nao um"))
        print(T("  paragrafo. Se ela junta tres metas com virgulas, provavelmente sao"))
        print(T("  tres metas — e o ciclo cumpre UMA de cada vez.\n"))
else:
    warn(T("A sua IA nao escreveu a META DO PRODUTO — o backlog entra sem ela."))

# 2) Os itens, na ordem de prioridade que a IA entregou (B1 = mais prioritario).
_FAIXA = {1: "Alta", 2: "Alta", 3: "Alta"}
for item in itens:
    titulo = item["historia"]
    prioridade = _FAIXA.get(item["prioridade"], "Media" if item["prioridade"] <= 6 else "Baixa")
    desc = Tf("Prioridade: {0} | Story Points: {1}", prioridade, item['pontos'])
    if item.get("aceitacao"):
        desc += Tf("\n\nCriterios de aceitacao:\n{0}", item['aceitacao'])
    achado = existentes.get(titulo.strip().lower())
    if achado:
        update_card(achado['id'], descricao=desc)
        ok(Tf("atualizado  [{0}] {1}", prioridade, titulo[:56]))
    else:
        create_card('product_backlog', titulo, desc)
        ok(Tf("criado      [{0}] {1}", prioridade, titulo[:56]))

caixa.consumir(log=step)
done(Tf("{0} itens no Product Backlog. Proximo passo: a Sprint Planning (sprint_planning.py).", len(itens)))
