## PP-8 — Lembrete de prazo apenas para quem não palpitou

**PRD:** `docs/prd/palpite-e-prazo.md`

**Como** participante casual, **quero** ser avisado antes do prazo fechar
só nos jogos em que ainda não palpitei, **para** não perder a rodada e não
receber aviso que eu não preciso.

**Prioridade:** Must — na Fase 1 o casual disse que se o app fizer só isso,
já ganhou; e é o que tira do admin o papel de cobrar.

**Critérios de aceite:**

- Dado que o prazo de um jogo está próximo e eu não palpitei nele, quando o
  lembrete dispara, então eu recebo o aviso.
- Dado que eu já palpitei em todos os jogos com prazo próximo, quando o
  lembrete dispara, então **eu não recebo nada**.
- Dado que recebo o lembrete, quando eu toco nele, então caio direto na tela
  de palpite daquele bolão, inclusive com o app fechado.
- Dado que eu neguei a permissão de notificação, quando uso o app, então nada
  trava e a contagem de tempo na tela continua sendo o aviso.
- Dado que eu palpitei depois de o lembrete ser agendado mas antes de ele
  disparar, então o lembrete não chega.

**Tasks:**

_Backend_
- [x] `BE-1` Determinar, por participante e por jogo, quem ainda não palpitou perto do prazo
- [x] `BE-2` Agendar e disparar o lembrete apenas para esses participantes (depende de BE-1)
- [x] `BE-3` Cancelar ou suprimir o lembrete de quem palpitou depois do agendamento (depende de BE-2)

_Mobile_
- [ ] `FE-1` Pedir permissão de notificação sem travar o app quando negada
- [ ] `FE-2` Deep link do lembrete para a tela de palpite do bolão certo, funcionando com app fechado
- [x] `FE-3` Não depender do push para o participante saber do prazo (fallback é a contagem na tela)

_DevOps_
- [ ] `OPS-1` Configurar FCM para Android, com credenciais fora do repositório
- [x] `OPS-2` Deixar a integração de APNs (iOS) implementada mas **desativada**, com o motivo documentado (depende de OPS-1)

_QA_
- [x] `QA-1` Escrever o plano de casos de teste a partir desta story
- [ ] `QA-2` Executar o plano com permissão negada, app fechado, e palpite feito entre o agendamento e o disparo

**Riscos/Dependências:**

- 🔴 **Esta story não funciona no iOS sem investimento.** O APNs exige uma chave
  criada no Apple Developer Program (US$ 99/ano); o FCM no Android é gratuito.
  Como a decisão de 03/08 foi não investir dinheiro, **o lembrete de prazo
  existe apenas no Android.** No iOS vale só o fallback de `FE-3` (a contagem na
  tela), que exige o usuário abrir o app.
  **Consequência de produto:** a necessidade que o casual classificou como a
  mais valiosa do app — *"se o app fizer só isso, já ganhou"* — fica sem
  atendimento em metade das plataformas. Não é bug; é a restrição de custo.
- **Não juntar este lembrete com avisos de ranking e comentário.** O PRD
  decidiu isso explicitamente: se vier tudo no mesmo pacote, o casual
  desliga tudo e volta a perder rodada.
- Depende de PP-1 (para saber quem palpitou) e da fonte de horário.
- Quantos minutos antes o lembrete dispara ainda não foi definido.

- **06/08:** `FE-3` está satisfeita por construção: **não existe push nesta
  versão**, e o participante sabe do prazo pela contagem na tela de palpite e
  pelo aviso gravado no banco. É justamente o fallback que a task pede.
- `FE-1` (permissão de notificação) e `FE-2` (deep link do lembrete) seguem
  abertas: a primeira só faz sentido quando houver push para pedir permissão, e
  a segunda depende de `OPS-1` (FCM), bloqueada por credencial. O deep link em si
  **já funciona** (`CC-5 FE-1`), então `FE-2` é só ligar o payload do push à rota
  quando o FCM existir.

- **07/08 — QA:** plano em `docs/testes/PP-8-plano.md`. `QA-1` fecha; `QA-2` **fica
  aberta** e vai ficar até o FCM existir: dois casos (`PP-8-10` permissão negada e
  `PP-8-11` toque no lembrete com o app fechado) não são executáveis sem push, e
  um terceiro (`PP-8-12`, iOS) não é defeito e sim a restrição de custo já
  registrada como risco 🔴.
- O plano registra que os **nove** casos restantes — inclusive "quem palpitou não
  recebe nada" e "palpite entre o agendamento e o disparo cancela o lembrete" — já
  estão cobertos por `test/lembretes.e2e-spec.ts`, então o que falta é
  exclusivamente a camada de push.
