"""
Agile Together — Capitulo 5: OKR Check-in (rode toda sexta-feira).

Calcula KR1, KR2, KR3 e KR4 a partir dos dados do board no ProjectAdm,
imprime relatorio com semaforo e propoe acoes para a proxima sprint.

Nao precisa preencher nada — le tudo do .env.

Rode pelo menu do curso (Iniciar).
"""
from agile_together import (compute_krs, cfg,
                            concluidos_fora_da_lista, move_card,
                            ensure_sprint_start_date)
from idioma import T, Tf


def status(valor, meta):
    if isinstance(meta, str):
        return "?"
    if valor >= meta:
        return "[OK]"
    if valor >= meta * 0.6:
        return "[!]"
    return "[X]"


c = cfg()
sprint = c.get('SPRINT_ATUAL', 1)
objetivo = c.get('OBJETIVO', '')[:50]

# Sem a data de inicio da Sprint, KR1..KR4 saem errados. Se o card de Planning
# existe mas esta sem data, pede a data ao aluno e grava antes de calcular.
if not ensure_sprint_start_date(sprint):
    raise SystemExit(
        Tf("A Sprint {0} ainda nao teve Sprint Planning. Rode sprint_planning.py para a Sprint "
           "{1} antes do OKR Check-in.", sprint, sprint))

krs = compute_krs(sprint)

print("=" * 60)
print(Tf("  AGILE TOGETHER — Verificacao de KRs (Sprint {0} de {1})", sprint, c.get('TOTAL_SPRINTS', 3)))
if objetivo and objetivo != 'ESCREVA SEU OBJETIVO AQUI':
    print("  " + Tf("Objetivo: {0}", objetivo))
print("=" * 60)

# KR1 — Taxa de Conclusao
k = krs['kr1']
print(Tf('\nKR1 — Taxa de Conclusao: {0} {1}%', status(k['valor'], 80), k['valor']))
print(Tf("      {0}  |  meta: 80%", k['detalhe']))

# KR2 — Velocidade (com comparacao explicita vs Sprint anterior)
k = krs['kr2']
print(Tf('\nKR2 — Velocidade: {0} cards concluidos na Sprint {1}', k['valor'], sprint))
print(f"      {k['detalhe']}")
if sprint > 1:
    try:
        prev = compute_krs(sprint - 1)
        prev_v = prev['kr2']['valor']
        delta = k['valor'] - prev_v
        tag = ('crescente' if delta > 0
               else 'declinante' if delta < 0 else 'estavel')
        print(Tf("      Sprint {0}: {1}  ->  Sprint {2}: {3}  (delta {4:+d} — {5})", sprint - 1, prev_v, sprint, k['valor'], delta, tag))
    except SystemExit as e:
        print(Tf("      [n/a] comparacao com Sprint {0} indisponivel: {1}", sprint - 1, str(e)[:80]))
else:
    print(T("      (primeira Sprint — estabelece o baseline; sem comparativo)"))

# KR3 — Consistencia do Scrum (por Sprint, NAO cumulativo)
k = krs['kr3']
meta3 = k['meta']
st3 = "[OK]" if k['valor'] >= meta3 else "[!]" if k['valor'] >= meta3 - 2 else "[X]"
print(Tf('\nKR3 — Consistencia do Scrum: {0} {1}/{2} eventos', st3, k['valor'], meta3))
print(f"      {k['detalhe']}")

# KR4 — Alavancagem de IA (por Sprint, NAO cumulativo)
k = krs['kr4']
meta4 = k['meta']
st4 = "[OK]" if k['valor'] >= meta4 else "[!]" if k['valor'] >= meta4 - 2 else "[X]"
print(Tf('\nKR4 — Alavancagem de IA: {0} {1}/{2} tarefas com [IA]', st4, k['valor'], meta4))
print(f"      {k['detalhe']}")

# Acoes sugeridas
print("\n" + "-" * 60)
print(T("  ACOES PARA A PROXIMA SPRINT"))
print("-" * 60)
acoes = []
if krs['kr1']['valor'] < 80:
    acoes.append("KR1 abaixo de 80%: reduza o Sprint Backlog na proxima Sprint Planning.")
if krs['kr3']['valor'] < krs['kr3']['meta']:
    falt = krs['kr3']['meta'] - krs['kr3']['valor']
    acoes.append(f"KR3: {falt} evento(s) ainda nao documentado(s). Mova para Concluido hoje.")
if krs['kr4']['valor'] < krs['kr4']['meta']:
    diff = krs['kr4']['meta'] - krs['kr4']['valor']
    acoes.append(f"KR4: use a sua IA na Daily para propor mais {diff} tarefa(s) do dia (elas entram marcadas com [IA]).")

if not acoes:
    print(Tf("  Sprint {0} dentro da meta. Prepare a Sprint Planning da proxima semana.", sprint))
else:
    for a in acoes:
        print(f"  - {a}")

# Organizacao do board: cards concluidos (status) fora da lista Concluido.
# Educamos o aluno a usar a lista Concluido/Incremento (pratica Scrum).
fora = concluidos_fora_da_lista()
if fora:
    print("\n" + "-" * 60)
    print(Tf("  ORGANIZACAO — {0} cartao(oes) concluido(s) fora da lista 'Concluido'", len(fora)))
    print("-" * 60)
    for c_ in fora[:12]:
        print(f"  - {(c_.get('titulo') or '')[:68]}")
    if len(fora) > 12:
        print(Tf("  ... e mais {0}", len(fora) - 12))
    resp = input(
        Tf("\n Mover esses {0} cartao(oes) para a lista 'Concluido' do Agile Together agora? "
           "[s/N]", len(fora))).strip().lower()
    if resp in ('s', 'sim', 'y', 'yes'):
        ok = 0
        for c_ in fora:
            try:
                move_card(c_['id'], 'concluido')
                ok += 1
            except Exception as e:
                print(f"  [ERRO] {(c_.get('titulo') or '')[:50]}: {e}")
        print(Tf("  [OK] {0}/{1} movido(s). Datas de conclusao originais preservadas.", ok, len(fora)))
    else:
        print(T("  Nada movido. Lembre-se: na pratica Scrum, todo item pronto "
              "vai para a lista Concluido/Incremento."))

print(T("\nProximo Check-in: proxima sexta-feira."))
print("=" * 60)
