# AppFirebase

Flutter app com backend Firebase — gerado pelo kasy.

---

## Documentação

A documentação completa do Kasy (CLI, release iOS, features, push, etc.) será publicada em **[docs.kasy.dev](https://docs.kasy.dev)** (site em construção).

Neste projeto, use os guias locais (não linkam para fora do repositório):

| Guia | Conteúdo |
|------|----------|
| [docs/auth-setup.md](docs/auth-setup.md) | Ativar login com Google, Apple e Facebook |
| [docs/ios-release.md](docs/ios-release.md) | Publicar no iOS com Mac (`kasy ios`) |
| [docs/codemagic-release.md](docs/codemagic-release.md) | Publicar sem Mac (`kasy codemagic`) |

---

## Como começar

```sh
flutter run          # detecta o dispositivo automaticamente
make run-ios         # iOS
make run-android     # Android
```

**Dispositivo físico via cabo**
- iOS: conecte o iPhone → confie neste computador → Xcode → Window → Devices → parear
- Android: Configurações → Opções do desenvolvedor → ativar depuração USB

**Deploy do backend** (quando estiver pronto):

```sh
kasy deploy
```

---

## Chaves e credenciais

Este projeto usa dois tipos de credenciais. Entender a diferença evita confusão na hora de configurar.

### Chaves do app (ficam no projeto)

Ficam no `.vscode/launch.json` como variáveis de ambiente de build (`--dart-define`). O Flutter lê via `String.fromEnvironment()`. **Nunca vão para o servidor.**

| Variável | Módulo | Como obter |
|----------|--------|------------|
| `RC_ANDROID_API_KEY` | RevenueCat | Dashboard RevenueCat → Apps → Android → chave pública **Google Play** (`goog_…`) |
| `RC_IOS_API_KEY` | RevenueCat | Dashboard RevenueCat → Apps → iOS → chave pública **Apple App Store** (`appl_…`) |
| `RC_WEB_API_KEY` | RevenueCat Web | Dashboard RevenueCat → Apps → Web Billing → chave **produção** (`rcb_…`, não `rcb_sb_`) em builds release |

### RevenueCat: `test_` vs loja (TestFlight / release)

- Chave que começa com **`test_`** = **Test Store** da RevenueCat: serve para **`flutter run` em debug** no Mac (compras fictícias no ambiente de teste da RC). **Não** use em IPA de TestFlight/App Store — o SDK bloqueia ou o app ignora o RC (comportamento atual do kit).
- **TestFlight / sandbox da Apple** (compras sem cobrar de verdade): use no IPA as chaves públicas de **loja** — **`appl_…`** (iOS) e **`goog_…`** (Android). No TestFlight as compras ainda são **sandbox** da Apple/Google, não cobrança real.
- A configuração **Firebase — prod** no VS Code **não** define mais RC; coloque `appl_` / `goog_` no seu **`.env`** na raiz do `Firebase/` ou em **`.dart_defines`** (ver `Makefile`) ao gerar release / TestFlight.
- **Firebase — dev** no VS Code continua com `test_` de exemplo só para desenvolvimento local.
| `SENTRY_DSN` | Sentry | Dashboard Sentry → Projeto → DSN |
| `MIXPANEL_TOKEN` | Mixpanel | Dashboard Mixpanel → Configurações → Token |

Para atualizar, edite o `.vscode/launch.json` ou passe via linha de comando:

```sh
flutter run --dart-define=RC_ANDROID_API_KEY=sua_chave
```

---

### Secrets do servidor (ficam no Secret Manager do GCP)

Usadas pelas **Cloud Functions** em tempo de execução. **Nunca ficam no código do app.**

| Secret | Usado por | Como obter |
|--------|-----------|------------|
| `REVENUECAT_WEBHOOK_KEY` | Webhook de assinaturas | Dashboard RevenueCat → Webhooks → Authorization header |
| `META_ACCESS_TOKEN` | Meta Conversions API | Meta Business Manager → System Users → Token |
| `META_DATASET_ID` | Meta Conversions API | Meta Business Manager → Events Manager → Dataset ID |

Para configurar ou atualizar cada secret:

```sh
firebase functions:secrets:set REVENUECAT_WEBHOOK_KEY --project=YOUR_PROJECT_ID
firebase functions:secrets:set META_ACCESS_TOKEN --project=YOUR_PROJECT_ID
firebase functions:secrets:set META_DATASET_ID --project=YOUR_PROJECT_ID
```

> Cada comando pede o valor interativamente. O valor **não aparece** no terminal.

Para ver os secrets existentes:

```sh
gcloud secrets list --project=YOUR_PROJECT_ID
```

---

## Internacionalização (i18n)

O app suporta **3 idiomas**: inglês (`en`), português (`pt`) e espanhol (`es`).

### Como o idioma é escolhido

```
App abre
  ├─ Tem idioma salvo pelo usuário? → usa o salvo
  └─ Não tem → lê o idioma do celular/browser
                ├─ É en, pt ou es? → usa esse idioma
                └─ Não é nenhum desses → usa o idioma padrão (base_locale)
```

### Mudar o idioma padrão (fallback)

Quando o dispositivo do usuário está em um idioma não suportado (ex: japonês, francês), o app usa o **idioma padrão**. Por padrão é inglês. Para mudar para português:

**`slang.yaml`**
```yaml
base_locale: pt   # trocar aqui: en | pt | es
```

Depois rodar:
```sh
dart run slang
```

### Adicionar ou editar traduções

Os arquivos ficam em `lib/i18n/`:
- `en.i18n.json` — inglês
- `pt.i18n.json` — português
- `es.i18n.json` — espanhol

Após editar qualquer `.i18n.json`, sempre rodar `dart run slang` para regenerar o `translations.g.dart`.

### Seletor de idioma

O usuário pode mudar o idioma nas **Configurações → Idioma**. A escolha fica salva no dispositivo e é restaurada na próxima abertura do app.

---

## RevenueCat webhook

O webhook recebe eventos de compra (nova assinatura, renovação, cancelamento) do RevenueCat.

**No dashboard do RevenueCat:** Webhooks → adicionar URL da função → Authorization header = valor da `REVENUECAT_WEBHOOK_KEY`.

---

## Deploy

```sh
# Deploy completo (Functions + regras Firestore + regras Storage)
firebase deploy --only functions,firestore:rules,storage --project=YOUR_PROJECT_ID

# Deploy somente Functions
firebase deploy --only functions --project=YOUR_PROJECT_ID
```

---

## Publicar no iOS (App Store)

Guia completo: [docs/ios-release.md](docs/ios-release.md)

```bash
kasy ios configure   # uma vez — credenciais Apple
kasy ios release     # gera IPA e envia para a App Store Connect
```

Sem Mac: [docs/codemagic-release.md](docs/codemagic-release.md)

---

## Segurança

O `.gitignore` já exclui: `firebase_key.json`, `.env`, `.env.*`, `*.pem`, `*.keystore`, `.kasy/apple.env`, `.kasy/codemagic.env`.

Nunca comite credenciais no repositório.
