## MG-7 — App falando com o Firebase pelos mesmos repositórios

**PRD:** `docs/prd/migracao-firebase.md`

**Como** participante, **quero** que o app continue igual, **para** a migração não
me custar nada — nem palpite, nem hábito.

**Prioridade:** Must — se o participante notar a troca, algo quebrou.

**Critérios de aceite:**

- Dado que o backend mudou, então **nenhuma tela muda**: a troca acontece atrás dos
  repositórios (`*_repository.dart`), não na apresentação.
- Dado que estou sem conexão, então o rascunho do palpite continua salvo no
  aparelho e sobe quando a rede volta.
- Dado que abro o app sem rede, então continuo vendo a lista de bolões e o ranking
  guardados, rotulados com a idade do dado.
- Dado que a contagem de prazo aparece, então ela segue o horário do servidor —
  mesmo com o relógio do aparelho alterado.
- Dado um bolão com 60 participantes, quando abro o ranking, então é uma leitura.
- Dado que o app aponta para o emulador em desenvolvimento, então isso é
  configuração, não código comentado.

**Tasks:**

_Mobile_
- [ ] `FE-1` Camada de dados falando com Firestore por trás dos repositórios existentes (depende de MG-2 BE-1)
- [ ] `FE-2` Chamadas de regra por Function (callable) onde a rule não basta (depende de MG-5 BE-1)
- [ ] `FE-3` Apontar para emulador por `--dart-define`, como já é feito com `API_URL` (depende de MG-1 BE-1)
- [ ] `FE-4` Rascunho offline e fila de envio preservados sobre o Firestore (depende de FE-1)
- [ ] `FE-5` Cache de leitura (lista, ranking, regras) preservado, com a idade visível (depende de FE-1)
- [ ] `FE-6` Remover o `ApiClient` HTTP quando nada mais o usar (depende de FE-1, FE-2)

_QA_
- [ ] `QA-1` Escrever o plano de casos de teste a partir desta story
- [ ] `QA-2` Executar em device os fluxos críticos: convite → palpite → ranking, offline e com relógio alterado

**Riscos/Dependências:**

- Depende de `MG-2`, `MG-3`, `MG-5`.
- **O cache offline muda de dono.** Hoje é o `CacheLocal` que grava envelope com
  idade; o Firestore tem persistência própria. Misturar os dois é o caminho para
  dado velho sem rótulo — decidir **um** e registrar por quê.
- Os 235 testes de widget não devem precisar mudar: eles falam com repositórios
  falsos. Se algum precisar, é sinal de que a troca vazou para a apresentação.
