-- Task "Perfil Sender" (Multi-BM) — cliente agrupa senders atribuídos em perfis
-- nomeados por serviço; a criação de campanha Multi-BM passa a exigir a escolha
-- de um perfil; o dispatch usa só os senders daquele perfil.
--
-- Aplicar com:
--   psql "$DATABASE_URL" -f migrations/031_task_sender_profiles.sql
-- Aditiva e idempotente (IF NOT EXISTS). Rollback: dropar as duas colunas e a
-- tabela — nenhum dado histórico depende delas (NULL = comportamento legado).

BEGIN;

-- 1) Tabela de perfis: um perfil pertence a um cliente (user) e um serviço.
--    UNIQUE(user_id, service_id, nome) impede nomes duplicados por cliente/serviço.
CREATE TABLE IF NOT EXISTS sender_profiles (
  id          varchar PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id     varchar NOT NULL REFERENCES users(id)    ON DELETE CASCADE,
  service_id  varchar NOT NULL REFERENCES services(id) ON DELETE CASCADE,
  nome        varchar(100) NOT NULL,
  created_at  timestamptz DEFAULT now(),
  updated_at  timestamptz DEFAULT now(),
  CONSTRAINT sender_profile_uniq UNIQUE (user_id, service_id, nome)
);

CREATE INDEX IF NOT EXISTS sender_profiles_user_service_idx
  ON sender_profiles (user_id, service_id);

-- 2) Membership do sender no perfil: mora na atribuição sender↔cliente.
--    O unique(sender_id, user_id) já existente garante "1 sender → ≤1 perfil"
--    por cliente de graça. ON DELETE SET NULL: excluir o perfil só desagrupa.
ALTER TABLE bm_sender_assignments
  ADD COLUMN IF NOT EXISTS sender_profile_id varchar
  REFERENCES sender_profiles(id) ON DELETE SET NULL;

CREATE INDEX IF NOT EXISTS bm_sender_assignments_profile_idx
  ON bm_sender_assignments (sender_profile_id);

-- 3) Perfil escolhido na campanha. NULL = lote legado (usa todos os senders).
--    ON DELETE SET NULL: excluir o perfil não apaga campanhas antigas.
ALTER TABLE campaigns
  ADD COLUMN IF NOT EXISTS sender_profile_id varchar
  REFERENCES sender_profiles(id) ON DELETE SET NULL;

CREATE INDEX IF NOT EXISTS campaigns_sender_profile_idx
  ON campaigns (sender_profile_id);

COMMIT;
