name = "server-edge-tracker"
# Entry point: worker.js (monólito original, 100% compatível)
# Para usar a versão modular ES Modules: altere para main = "index.ts"
main = "index.ts"
compatibility_date = "2025-01-01"
compatibility_flags = ["nodejs_compat"]
workers_dev = true

# ── Worker Routes — same-domain tracking (imune a bloqueios) ─────────────────
# Configurar por projeto antes do deploy:
# [[routes]]
# pattern  = "SEU_DOMINIO/track*"
# zone_name = "SEU_DOMINIO"
#
# [[routes]]
# pattern  = "*.SEU_DOMINIO/track*"
# zone_name = "SEU_DOMINIO"
#
# [[routes]]
# pattern  = "SEU_DOMINIO/webhook/*"
# zone_name = "SEU_DOMINIO"
#
# [[routes]]
# pattern  = "SEU_DOMINIO/health"
# zone_name = "SEU_DOMINIO"
#
# [[routes]]
# pattern  = "SEU_DOMINIO/api/*"
# zone_name = "SEU_DOMINIO"

# ── Variáveis públicas (não são segredos) ─────────────────────────────────────
# Preencher por projeto antes do deploy:
[vars]
META_PIXEL_ID        = ""
GA4_MEASUREMENT_ID   = ""
TIKTOK_PIXEL_ID      = ""
SITE_DOMAIN          = "SEU_DOMINIO"
ZAPMAN_API_URL       = ""
ZAPMAN_CRM_INSTANCE  = ""
ZAPMAN_WEBHOOK_URL   = ""

# ── Banco D1 ──────────────────────────────────────────────────────────────────
# Após criar o banco com "wrangler d1 create cdp-edge-db",
# substitua o database_id pelo ID retornado no terminal.
[[d1_databases]]
binding      = "DB"
database_name = "cdp-edge-db"
database_id  = "7867d38f-5fa8-4c17-b465-386211422c09"

# ── Queues — Retry + Dead Letter Queue ───────────────────────────────────────
# Produtor: worker envia eventos com falha para cdp-edge-retry
# Consumidor: worker processa a fila e reaplica; falhas vão para cdp-edge-dlq
# Criar com: wrangler queues create cdp-edge-retry
#            wrangler queues create cdp-edge-dlq
[[queues.producers]]
binding   = "RETRY_QUEUE"
queue     = "cdp-edge-retry"

[[queues.consumers]]
queue                    = "cdp-edge-retry"
max_batch_size           = 10
max_batch_timeout        = 30
max_retries              = 3
dead_letter_queue        = "cdp-edge-dlq"

# ── KV Namespace — Geo/Session Cache ─────────────────────────────────────────
# Cache de geolocalização e sessões recentes (TTL: 1h por padrão)
# Criar com: wrangler kv namespace create GEO_CACHE
#            wrangler kv namespace create GEO_CACHE --preview
[[kv_namespaces]]
binding    = "GEO_CACHE"
id         = "821b6c1ccb4b475985439b801c1fdbe0"
preview_id = "d2d9198f47e340ee905a8dc566b09e95"

# ── R2 Bucket — Audit Logs ────────────────────────────────────────────────────
# Logs imutáveis por evento: logs/YYYY/MM/DD/{timestamp}_{eventName}.json
# Sem PII — apenas userId, eventId, ltvClass, UTMs, geo
[[r2_buckets]]
binding     = "AUDIT_LOGS"
bucket_name = "cdp-edge-logs"

# ── Cron Triggers — Intelligence Agent ───────────────────────────────────────
# Semanal: domingo 02:00 UTC — check de versões de API + relatório diário
# Mensal:  1º do mês 03:00 UTC — auditoria de taxa de erro + alertas críticos
[triggers]
crons = ["0 2 * * 7", "0 3 1 * *"]

# ── Cloudflare Workers AI ─────────────────────────────────────────────────────
# Habilita env.AI para LTV Prediction (Fase 4)
# Plano gratuito inclui 10.000 neurônios/dia — suficiente para enrichment
[ai]
binding = "AI"

# ── Rate Limiting — proteção do /track contra abuso de cota ──────────────────
# Bloqueia na borda ANTES de qualquer processamento do Worker
# Limite: 60 requisições por minuto por IP (generoso para usuário real)
# Requer Workers Paid plan ($5/mês) — remover bloco se usar plano free
[[unsafe.bindings]]
name         = "RATE_LIMITER"
type         = "ratelimit"
namespace_id = "1001"

[unsafe.bindings.simple]
limit  = 60
period = 60

# ── Observabilidade — Logs + Traces persistidos no painel Cloudflare ─────────
[observability]
enabled            = false
head_sampling_rate = 1

[observability.logs]
enabled            = true
head_sampling_rate = 1
persist            = true
invocation_logs    = true

[observability.traces]
enabled            = false
persist            = true
head_sampling_rate = 1

# ── Secrets (NÃO ficam aqui — configurar via CLI uma única vez) ───────────────
# Secrets são PERMANENTES na Cloudflare — deploy nunca apaga.
# Só execute o comando abaixo se o secret ainda não existir:
#
# wrangler secret put META_ACCESS_TOKEN        ← token Meta CAPI
# wrangler secret put ADMIN_API_TOKEN          ← token Bearer para rotas /api/* administrativas
# wrangler secret put GA4_API_SECRET           ← secret GA4 Measurement Protocol
# wrangler secret put TIKTOK_ACCESS_TOKEN      ← token TikTok Events API (opcional)
# wrangler secret put META_AD_ACCOUNT_ID       ← ID da conta de anúncios Meta
# wrangler secret put WHATSAPP_TOKEN           ← Token WhatsApp Cloud API
# wrangler secret put WHATSAPP_PHONE_NUMBER_ID ← ID do número WhatsApp
# wrangler secret put WA_ACCESS_TOKEN          ← Token legado WhatsApp (compatibilidade)
# wrangler secret put WA_PHONE_ID              ← ID legado do número (compatibilidade)
# wrangler secret put WA_NOTIFY_NUMBER         ← Número que recebe alertas de venda/lead
# wrangler secret put WA_WEBHOOK_VERIFY_TOKEN  ← Token de verificação do webhook WhatsApp
# wrangler secret put META_APP_SECRET          ← App Secret para validar x-hub-signature-256 do WhatsApp
# wrangler secret put WEBHOOK_SECRET_TICTO     ← HMAC-SHA256 Ticto
# wrangler secret put CALLMEBOT_PHONE          ← Número CallMeBot para alertas
# wrangler secret put CALLMEBOT_APIKEY         ← API Key CallMeBot
# wrangler secret put ZAPMAN_API_KEY           ← DASHBOARD_SECRET do ZapMan (X-API-Key)
# wrangler secret put ALLOWED_COUNTRIES        ← CSV ISO-2 geo-fence ex: "BR"
# wrangler secret put FRAUD_DROP_THRESHOLD     ← Score mínimo para drop (default 50)
# wrangler secret put FRAUD_BLOCK_DATACENTERS  ← "1" = bloquear datacenters
