# CDP Edge — SDK Reference
> API pública do `cdpTrack.js` — todas as funções, parâmetros e exemplos.

---

## Instalação

```html
<!-- No <head> -->
<script type="module">
  import { init } from '/js/cdpTrack.js';
  await init();
</script>
```

Após `init()`, todas as funções ficam disponíveis em `window.cdpTrack`.

---

## init()

Inicializa o SDK completo. Deve ser chamado uma vez por página.

```javascript
import { init } from '/js/cdpTrack.js';
await init();
```

**O que faz internamente:**
1. Google Consent Mode v2 (defaults negados — LGPD compliant)
2. Anti-blocking (retry automático com beacon fallback)
3. Micro-events (scroll, tempo, vídeo, clique, hover)
4. Auto-captura de formulários de lead
5. Salva contexto de afiliado no localStorage (UTM resurrection)
6. passCheckoutParams (injeta `_cdp_uid` nos links de checkout)
7. Behavior Engine (scoring avançado)

---

## track(eventName, data?)

Função principal. Envia qualquer evento para o Worker.

```javascript
await window.cdpTrack.track('EventName', {
  // dados do evento
});
```

**Parâmetros:**

| Parâmetro | Tipo | Descrição |
|---|---|---|
| `eventName` | `string` | Nome do evento (ver Events Reference) |
| `data` | `object` | Dados do evento (opcional) |

**O que é enviado automaticamente** (sem precisar passar):
- `event_id` — UUID único gerado no browser
- `user_id` — `_cdp_uid` (cookie first-party)
- `session_id` — sessionStorage ID
- `utms` — utm_source, utm_medium, utm_campaign, utm_content, utm_term
- `click_ids` — fbp, fbc, gclid, wbraid, gbraid, ttclid, rclid
- `page_url` — `window.location.href`
- `referrer` — `document.referrer`
- `user_agent` — `navigator.userAgent`
- `behavioral_data` — engagement score completo

**Retorno:**
```javascript
{
  success: true,
  event_id: "1711234567890_abc123def",
  result: { ... }
}
// ou em caso de erro:
{
  success: false,
  error: "mensagem de erro",
  event_id: "...",
  attempts: 3
}
```

---

## trackLead(userData, form?)

Atalho para captura de lead. Aceita dados crus — o Worker faz SHA256.

```javascript
await window.cdpTrack.trackLead({
  email: 'fulano@exemplo.com',
  phone: '11999998888',
  firstName: 'João',
  lastName: 'Silva'
});

// Com formulário HTML (extrai campos automaticamente)
const form = document.querySelector('#form-lead');
await window.cdpTrack.trackLead({}, form);
```

**Parâmetros aceitos:**

| Campo | Tipo | Normalização automática |
|---|---|---|
| `email` | string | lowercase + trim |
| `phone` | string | DDI 55 + somente dígitos |
| `firstName` | string | Title Case |
| `lastName` | string | Title Case |
| `city` | string | lowercase + sem acentos |
| `state` | string | uppercase |
| `zip` | string | somente dígitos |
| `country` | string | lowercase |

---

## trackPurchase(orderData)

Atalho para compra confirmada.

```javascript
await window.cdpTrack.trackPurchase({
  value: 297.00,
  currency: 'BRL',
  order_id: 'ORD-12345',
  email: 'fulano@exemplo.com',
  content_name: 'Curso XYZ',
  content_ids: ['SKU-001']
});
```

---

## trackViewContent(contentData)

Visualização de produto ou oferta.

```javascript
await window.cdpTrack.trackViewContent({
  content_name: 'Página de Vendas — Curso XYZ',
  content_type: 'product',
  value: 297.00,
  currency: 'BRL'
});
```

---

## trackAddToCart(cartData)

Adição ao carrinho.

```javascript
await window.cdpTrack.trackAddToCart({
  content_id: 'SKU-001',
  content_name: 'Produto XYZ',
  value: 97.00,
  currency: 'BRL',
  num_items: 1
});
```

---

## updateConsent(params)

Atualiza o Google Consent Mode v2 após o usuário aceitar o banner de cookies.

```javascript
// Usuário aceitou tudo
window.cdpTrack.updateConsent({ analytics: true, ads: true });

// Só analytics, rejeitou anúncios
window.cdpTrack.updateConsent({ analytics: true, ads: false });

// Rejeitou tudo
window.cdpTrack.updateConsent({ analytics: false, ads: false });
```

O consentimento é persistido no `localStorage` e restaurado automaticamente em visitas futuras.

---

## getUserId()

Retorna o `_cdp_uid` (cookie first-party, 365 dias).

```javascript
const uid = window.cdpTrack.getUserId();
// "1711234567890_abc123def"
```

---

## getUserIdWithFallback()

Retorna o `_cdp_uid` com fallback para o `localStorage` (útil para afiliados e links em nova aba).

```javascript
const uid = window.cdpTrack.getUserIdWithFallback();
```

**Prioridade:** cookie → localStorage (`_cdp_aff`) → string vazia.

---

## getUTMs()

Retorna os UTMs capturados da URL atual.

```javascript
const utms = window.cdpTrack.getUTMs();
// {
//   utm_source: "meta",
//   utm_medium: "paid",
//   utm_campaign: "curso-xyz",
//   utm_content: "video-1",
//   utm_term: ""
// }
```

---

## getUTMsWithFallback()

Retorna UTMs da URL ou do localStorage (fallback de 30 dias — attribution resurrection para afiliados).

```javascript
const utms = window.cdpTrack.getUTMsWithFallback();
```

**Prioridade:** URL params → localStorage (`_cdp_aff`) → objeto vazio.

---

## getSessionId()

Retorna o session ID (cross-tab, expira ao fechar o browser).

```javascript
const sid = window.cdpTrack.getSessionId();
// "1711234567890_xyz456abc"
```

---

## passCheckoutParams(options?)

Injeta UTMs e `_cdp_uid` nos links de checkout externos. Chamado automaticamente em `init()`.

```javascript
// Chamada manual com configuração customizada
passCheckoutParams({
  platforms: ['hotmart', 'kiwify', 'ticto'],
  domains: ['meusite.com/checkout']  // domínios customizados
});
```

**Plataformas suportadas e parâmetros injetados:**

| Plataforma | Parâmetros |
|---|---|
| Hotmart | `xcod` (user_id) + `sck` (utm_source\|medium\|campaign\|content\|term) |
| Kiwify | `src` (utm_source) + `utm_medium` + `utm_campaign` |
| Eduzz | `src` (utm_source) |
| Monetizze | `src` (utm_source) |
| CartPanda | utm_* passthrough direto |
| Ticto | utm_* + `user_id` |
| Custom | utm_* + `cdp_uid` |

**Nota:** links adicionados dinamicamente (lazy load, pop-ups) são rastreados automaticamente via `MutationObserver`.

---

## setupAutoFormCapture()

Intercepta submits de formulários com campos de email ou telefone e dispara `trackLead()` automaticamente. Chamado em `init()` por padrão.

```javascript
// Já é chamado em init(). Para uso manual:
setupAutoFormCapture();
```

Para desabilitar:
```javascript
// Em tracking.config.js
export default {
  autoCaptureForms: false,
  // ...
}
```

---

## Micro-events — getVideoSummary()

Retorna o estado agregado de todos os vídeos na página (útil para VSL multi-vídeo).

```javascript
import { getVideoSummary } from '/js/micro-events.js';

const summary = getVideoSummary();
// {
//   totalVideos: 2,
//   startedCount: 1,
//   completedCount: 0,
//   maxProgress: 75    // maior % atingida entre todos os vídeos
// }
```

---

## Eventos DOM customizados

O `micro-events.js` emite eventos DOM que a página pode ouvir para reagir ao comportamento do usuário:

```javascript
// Destravar CTA quando vídeo atingir 75%
window.addEventListener('cdp:VideoProgress', (e) => {
  if (e.detail.progress_percent >= 75) {
    document.getElementById('cta').style.display = 'block';
  }
});

// Mostrar formulário de lead ao 50% do scroll
window.addEventListener('cdp:Scroll', (e) => {
  if (e.detail.scroll_depth >= 50) {
    document.getElementById('lead-form').classList.remove('hidden');
  }
});

// Eventos disponíveis:
// cdp:Scroll, cdp:TimeOnPage, cdp:VideoPlay, cdp:VideoProgress,
// cdp:VideoComplete, cdp:VideoDropout, cdp:VideoPause, cdp:VideoSeek,
// cdp:Click, cdp:CTAHover, cdp:RapidClicks
```

---

## tracking.config.js — Configuração do SDK

```javascript
// extracted-skill/tracking-events-generator/tracking.config.js
export default {
  // IDs de plataformas
  metaPixelId:     'SEU_PIXEL_ID',
  ga4Id:           'G-XXXXXXXXXX',
  tiktokPixelId:   'CXXXXXXXXXXXXXXX',

  // Endpoint do Worker
  endpoint: 'https://track.seudominio.com.br/track',

  // Comportamento
  autoCaptureForms:   true,   // captura formulários automaticamente
  passCheckoutParams: true,   // injeta params em links de checkout
  initBehaviorEngine: true,   // scoring avançado

  // Plataformas para passCheckoutParams
  platforms: ['hotmart', 'kiwify', 'ticto'],

  // Google Consent Mode v2
  consent: {
    defaultDenied:  true,   // começa negado (LGPD compliant)
    waitForUpdate:  500,    // ms aguardar CMP
    urlPassthrough: true,   // preserva gclid/fbclid sem consent
  },

  debug: false  // true para logs no console
};
```
