# -*- coding: utf-8 -*-
"""
Agile Together — Sprint Planning.

O passo faz tudo de uma vez, depois que a resposta da IA esta no quadro:
  1. cria o cartao "META DA SPRINT N: ..." no Sprint Backlog;
  2. move os itens escolhidos do Product Backlog para o Sprint Backlog;
  3. conclui o evento "Sprint N - Sprint Planning" e grava a DATA DE INICIO da
     Sprint no proprio cartao — essa data e' a unica fonte do intervalo da
     Sprint, e sem ela o Check-in nao consegue calcular KR1 e KR2.

O prompt ja' sai com os titulos REAIS do seu Product Backlog dentro. Se a IA
devolver um item que nao existe no quadro, o passo ABORTA sem criar nada — item
inventado nunca entra na Sprint.
"""
import datetime

import caixa
import entradas
import prompts
from agile_together import (cfg, get_cards, create_card, move_card,
                            register_event, update_card)
from runner import header, step, ok, warn, done
from idioma import T, Tf

c = cfg()
sprint = c.get('SPRINT_ATUAL', 1)
total = c.get('TOTAL_SPRINTS', 3)

backlog = get_cards('product_backlog')
titulos_reais = [(b.get('titulo', '') or '') for b in backlog]
if not titulos_reais:
    raise SystemExit(T("O Product Backlog esta vazio — rode o criar_backlog.py antes."))

meta_produto = next((t.split(':', 1)[1].strip() for t in titulos_reais
                     if t.upper().startswith("META DO PRODUTO")), "")
selecionaveis = [t for t in titulos_reais if not t.upper().startswith("META DO PRODUTO")]

secoes = caixa.ler(
    ["META DA SPRINT", "SELECIONADOS"],
    f"Sprint Planning — Sprint {sprint} de {total}",
    prompts.planning(sprint, meta_produto, selecionaveis),
    obrigatorias=["SELECIONADOS"],   # a META vem por caixa.valor(), fora das secoes
)

meta_sprint = caixa.valor(secoes, "META DA SPRINT")
escolhidos = [i["_"] for i in entradas.itens(caixa.secao(secoes, "SELECIONADOS")) if i.get("_")]

if not meta_sprint:
    raise SystemExit(T("A resposta nao trouxe a META DA SPRINT. Peca de novo a sua IA."))
if not escolhidos:
    raise SystemExit(T("A resposta nao trouxe nenhum item em SELECIONADOS."))

# ── VALIDACAO: todo item escolhido PRECISA existir no Product Backlog ────────
resolvidos, faltando = [], []
for trecho in escolhidos:
    alvo = trecho.strip()
    achado = next((b for b in backlog
                   if alvo.lower() in (b.get('titulo', '') or '').lower()), None)
    (resolvidos if achado else faltando).append((alvo, achado))

if faltando:
    header(T("Item inexistente no Product Backlog — NADA foi criado"))
    for trecho, _ in faltando:
        warn(Tf("nao existe no quadro: {0}", trecho[:70]))
    print(T("\n  O seu Product Backlog tem exatamente estes itens:"))
    for t in selecionaveis:
        print(f"   - {t}")
    raise SystemExit(
        T("\nPeca a sua IA para escolher SOMENTE entre os titulos acima, "
        "copiados como estao, e cole a resposta de novo na Caixa de entrada."))

header(Tf("Sprint Planning — Sprint {0} de {1}", sprint, total))

# 1) A Meta da Sprint — o compromisso do Sprint Backlog (Guia do Scrum).
titulo_meta = f"META DA SPRINT {sprint}: {meta_sprint}"
create_card('sprint_backlog', titulo_meta, "")
ok(titulo_meta[:72])

# 2) Mover os itens (todos ja' validados como reais).
movidos = 0
for trecho, achado in resolvidos:
    move_card(achado['id'], 'sprint_backlog')
    ok(f"movido  {achado['titulo'][:60]}")
    movidos += 1

# 3) Evento + data de inicio da Sprint.
card_planning = register_event("Sprint Planning")
if card_planning:
    hoje = datetime.date.today().isoformat()
    update_card(card_planning['id'], data_inicio=hoje)
    step(Tf("Inicio da Sprint {0} gravado no evento: {1}", sprint, hoje))
else:
    warn(T("Evento 'Sprint Planning' nao encontrado — o intervalo da Sprint NAO foi "
         "gravado e o Check-in vai falhar. Rode o configurar_board.py e tente de novo."))

caixa.consumir(log=step)
done(Tf("Sprint {0} planejada: {1} itens no Sprint Backlog. Amanha, a Daily (daily_scrum.py).", sprint, movidos))
