-- CDP Edge — Composite Indexes para Performance
-- Executar após todos os outros schemas:
--   wrangler d1 execute cdp-edge-db --file=schema-indexes.sql --remote
--
-- Todos os índices usam IF NOT EXISTS — idempotente, seguro para re-executar.

-- ── leads: queries mais comuns ────────────────────────────────────────────────

-- Deduplicação por email + janela temporal (upsertProfile, saveLead)
CREATE INDEX IF NOT EXISTS idx_leads_email_created
  ON leads(email, created_at DESC);

-- Relatórios por plataforma + período (Intelligence Agent, Dashboard)
CREATE INDEX IF NOT EXISTS idx_leads_platform_created
  ON leads(platform, created_at DESC);

-- Lookup de conversão por evento + período (auditErrorRates, generateDailyReport)
CREATE INDEX IF NOT EXISTS idx_leads_event_created
  ON leads(event_name, created_at DESC);

-- Identity resolution: user_id + evento para evitar duplicatas
CREATE INDEX IF NOT EXISTS idx_leads_userid_event
  ON leads(user_id, event_name);

-- Exportação Customer Match: event_name + email filtrado por data
CREATE INDEX IF NOT EXISTS idx_leads_event_email
  ON leads(event_name, email);

-- CRM Dashboard: ordenação por status + criação
CREATE INDEX IF NOT EXISTS idx_leads_crm_created
  ON leads(crm_status, created_at DESC);

-- ── user_profiles: enrichment e Advanced Matching ────────────────────────────

-- Busca por LTV class + atualização (Bidding ML consome isso)
CREATE INDEX IF NOT EXISTS idx_profiles_ltv_updated
  ON user_profiles(predicted_ltv_class, updated_at DESC);

-- Score + cohort para segmentação ML (handleSegmentationCluster)
CREATE INDEX IF NOT EXISTS idx_profiles_score_cohort
  ON user_profiles(score DESC, cohort_label);

-- Lookup email + updated_at (resolveDeviceGraph, getProfileByEmail)
CREATE INDEX IF NOT EXISTS idx_profiles_email_updated
  ON user_profiles(email, updated_at DESC);

-- ── fraud_signals: dashboard e alertas ───────────────────────────────────────

-- handleFraudAlerts: filtra por ip + período (coluna: detected_at)
CREATE INDEX IF NOT EXISTS idx_fraud_ip_detected
  ON fraud_signals(ip_address, detected_at DESC);

-- handleFraudStats: fraud_score >= threshold ordenado por data
CREATE INDEX IF NOT EXISTS idx_fraud_score_detected
  ON fraud_signals(fraud_score DESC, detected_at DESC);

-- ── ltv_ab_assignments: resultados de A/B test ───────────────────────────────

-- handleLtvAbTestResults: test_id + predicted_class para análise
CREATE INDEX IF NOT EXISTS idx_ab_testid_class
  ON ltv_ab_assignments(test_id, predicted_class);

-- ── ml_segment_members: join com leads para bidding ─────────────────────────

-- handleBiddingRecommend: segment_id lookup (coluna: assigned_at)
CREATE INDEX IF NOT EXISTS idx_seg_members_segid
  ON ml_segment_members(cluster_id, assigned_at DESC);
