# Kasy App

Flutter app com backend Firebase — gerado pelo kasy.

---

## Documentação

A documentação completa do Kasy está em **[kasy.dev/docs](https://kasy.dev/docs)** — instalação, features, personalização, publicação e troubleshooting, passo a passo.

Neste projeto você também tem guias locais (funcionam offline):

| Guia | Conteúdo |
|------|----------|
| [docs/auth-setup.md](docs/auth-setup.md) | Ativar login com Google, Apple e Facebook |
| [docs/revenuecat-setup.md](docs/revenuecat-setup.md) | Ativar assinaturas (RevenueCat) do teste à produção |
| [docs/ad_mobs.md](docs/ad_mobs.md) | Anúncios (AdMob) e recompensas verificadas |
| [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`) |
| [docs/figma-workflow.md](docs/figma-workflow.md) | Fluxo Figma → Flutter para assistentes de IA |
| [docs/figma-guia.md](docs/figma-guia.md) | Guia Figma passo a passo (rebrand e telas) |
| [design/README.md](design/README.md) | Design system Figma (link Community + duplicate) |

---

## Como começar

```sh
kasy run             # recomendado — lê o .env e escolhe as chaves certas
kasy run --ios       # simulador iOS
kasy run --android   # emulador Android
kasy run --web       # web em localhost:5555
```

Alternativas: `make run` ou `flutter run` funcionam, mas sem os extras do `kasy run` (escolha automática de chave RevenueCat, log em `.kasy/run.log`, aviso de update).

**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 arquivo **`.env`** na raiz do projeto (cada chave tem um comentário explicando). O `kasy run` lê o `.env` e injeta os valores no build via `--dart-define`; o Flutter lê com `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 |
| `SENTRY_DSN` | Sentry | Dashboard Sentry → Projeto → DSN |
| `MIXPANEL_TOKEN` | Mixpanel | Dashboard Mixpanel → Configurações → Token |

Para atualizar uma chave, edite o `.env` e rode `kasy run` de novo.

### 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`.

---

### 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`, `.kasy/*.log`.

Nunca comite credenciais no repositório.
