-- migrations/always/ensure_indexes.sql
--
-- Executado em TODO deploy (deploy.sh, passo 4, depois do runner de
-- migrations) — NÃO é uma migration numerada; é a rede de segurança dos
-- índices críticos. Motivo (16/07/2026): o drizzle-kit push DROPA índices
-- que não constam do shared/schema.ts — um deploy apagou 12 índices da
-- produção (atribuição de MO, dedupe do webhook, Alta Vazão). Os índices
-- SIMPLES foram espelhados no schema (o push os mantém/recria); os PARCIAIS
-- (WHERE ...) não podem ser espelhados com segurança (round-trip frágil do
-- kit), então este arquivo os re-garante a cada deploy.
--
-- ⚠ Criou um índice crítico novo numa migration NNN? Adicione-o AQUI também
--   (e, se for simples, espelhe no shared/schema.ts).
--
-- CONCURRENTLY: não bloqueia writes se precisar reconstruir em tabela
-- grande. psql -f roda em autocommit (sem BEGIN), então é permitido.
-- IF NOT EXISTS: no-op quando o índice já existe (caminho normal).

-- 0) Limpa índices INVALID desta lista (um CREATE CONCURRENTLY interrompido
--    deixa o índice inválido e o IF NOT EXISTS o pularia para sempre).
DO $$
DECLARE
  bad record;
BEGIN
  FOR bad IN
    SELECT c.relname AS idxname
    FROM pg_index i
    JOIN pg_class c ON c.oid = i.indexrelid
    WHERE NOT i.indisvalid
      AND c.relname IN (
        'idx_multibm_messages_phone',
        'idx_multibm_messages_campaign_status',
        'idx_multibm_messages_bm_sent',
        'idx_multibm_messages_sender_sent',
        'idx_multibm_messages_status_sent',
        'idx_multibm_messages_sent_at',
        'idx_multibm_messages_nonterminal',
        'uidx_multibm_messages_infobip_id',
        'idx_waba_messages_phone',
        'idx_waba_messages_campaign_id',
        'uidx_waba_messages_infobip_id',
        'idx_bm_senders_number',
        'idx_infobip_senders_number'
      )
  LOOP
    EXECUTE format('DROP INDEX IF EXISTS %I', bad.idxname);
    RAISE NOTICE 'ensure_indexes: índice INVALID % removido para recriação', bad.idxname;
  END LOOP;
END $$;

-- 1) PARCIAIS (fora do schema Drizzle de propósito)
CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS uidx_multibm_messages_infobip_id
  ON multibm_messages (infobip_message_id) WHERE infobip_message_id IS NOT NULL;
CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS uidx_waba_messages_infobip_id
  ON waba_messages (infobip_message_id) WHERE infobip_message_id IS NOT NULL;
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_multibm_messages_nonterminal
  ON multibm_messages (campaign_id) WHERE status NOT IN ('DELIVERED','SEEN','FAILED');

-- 2) SIMPLES (também espelhados no shared/schema.ts — aqui é o cinto extra)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_multibm_messages_phone ON multibm_messages (phone);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_multibm_messages_campaign_status ON multibm_messages (campaign_id, status);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_multibm_messages_bm_sent ON multibm_messages (bm_id, sent_at);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_multibm_messages_sender_sent ON multibm_messages (sender_id, sent_at);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_multibm_messages_status_sent ON multibm_messages (status, sent_at);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_multibm_messages_sent_at ON multibm_messages (sent_at);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_waba_messages_phone ON waba_messages (phone);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_waba_messages_campaign_id ON waba_messages (campaign_id);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bm_senders_number ON bm_senders (number);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_infobip_senders_number ON infobip_senders (number);
