# Kasy App

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_TEST_KEY` | RevenueCat | Dashboard RevenueCat → Apps → Test Store → chave (`test_…`). **Uma chave só, serve pra iOS+Android.** Usada automaticamente em simulador/emulador. |
| `RC_IOS_PROD_KEY` | RevenueCat | Dashboard RevenueCat → Apps → App Store → chave (`appl_…`). Usada automaticamente em iPhone físico (Sandbox e Produção). |
| `RC_ANDROID_PROD_KEY` | RevenueCat | Dashboard RevenueCat → Apps → Google Play → chave (`goog_…`). Usada automaticamente em Android físico. |
| `RC_WEB_API_KEY` | RevenueCat Web | Dashboard RevenueCat → Apps → Web Billing → chave **produção** (`rcb_…`, não `rcb_sb_`) em builds release |

### RevenueCat: `kasy run` escolhe a chave automaticamente

A CLI detecta se você vai rodar em **simulador/emulador** ou em **dispositivo físico** e injeta a chave certa:

| Onde você roda | Chave usada |
|---|---|
| iOS Simulator / Android Emulator | `RC_TEST_KEY` (test_) |
| iPhone físico | `RC_IOS_PROD_KEY` (appl_) — fallback `RC_TEST_KEY` se ausente |
| Android físico | `RC_ANDROID_PROD_KEY` (goog_) — fallback `RC_TEST_KEY` se ausente |

Forçar manualmente: `kasy run --rc=test` ou `kasy run --rc=prod`. `--rc=auto` (default) usa a regra acima.

- **Por que o split?** Simulador iOS e emulador Android não conseguem fazer in-app purchase real com chaves `appl_`/`goog_` — só funciona Test Store da RevenueCat. Já em físico, `appl_`/`goog_` cobre Sandbox e Produção (o SDK detecta sozinho).
- **TestFlight e release:** use as chaves de produção. **NUNCA suba `test_` para a loja** — o SDK do RevenueCat crasha o app no release.
- **VS Code (F5 sem kasy run):** o `launch.json` carrega `RC_TEST_KEY` como default (ou produção se test_ ausente). Pra alternar manualmente, rode pelo `kasy run`.
| `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.
