-- =====================================================================
-- Migration 020 — COM#4: renomeia ENUM agente_modalidade nas 4 tabelas
-- Data: 09/05/2026
-- PRD: PRD-0002 RF-02 (atualizada) + ADR-0007 (regra fallback Premium)
--
-- ENUM antigo: ('pct_venda','pct_comissao','tabela_preco')
-- ENUM novo:   ('pct_parceiro','pct_cliente_final','tabela_preco')
--
-- Tabelas afetadas:
--   tbl_Representante.agente_modalidade           (cadastro do agente)
--   tbl_Pedido.agente_modalidade_snap             (snapshot do pedido — 48 linhas)
--   tbl_Faturamento.agente_modalidade_snap        (snapshot propagado — 1 linha)
--   tbl_HistPedido.agente_modalidade_snap         (snapshot histórico — 0 linhas)
--
-- Ordem das operações (validada pela DBA Camila Rocha em 09/05/2026):
--   1) DROP triggers de propagação (ADR-0005, ADR-0006)
--   2) UPDATE dados existentes para os valores novos do ENUM
--   3) ALTER ENUM nas 4 tabelas
--   4) CREATE triggers (idênticas em comportamento)
--
-- Por que essa ordem:
--   - Triggers usam IFNULL+SELECT do tipo da coluna; após ALTER do tipo de origem
--     vs destino, melhor recriar pra garantir consistência interna do MySQL.
--   - UPDATE antes do ALTER porque o ALTER ENUM rejeita linhas com valor inválido
--     (em strict mode); migrar valores ANTES é o caminho seguro.
--   - SET SESSION sql_mode='' contorna NO_ZERO_DATE em registros legados de
--     tbl_Representante (data_cadastro = '0000-00-00' em algumas linhas — regra
--     dura registrada em memória `feedback_engine_tabelas_tefnet_erp_myisam_vs_innodb`
--     e em ADR-0005 nota de implementação).
-- =====================================================================

SET SESSION sql_mode = '';

-- ---------------------------------------------------------------------
-- 1) DROP triggers de propagação (recriadas no fim)
-- ---------------------------------------------------------------------
DROP TRIGGER IF EXISTS trg_agente_snapshot_faturamento_bi;
DROP TRIGGER IF EXISTS trg_agente_snapshot_histpedido_bi;

-- ---------------------------------------------------------------------
-- 2) UPDATE dados existentes para valores novos do ENUM
--    Decisões fechadas pelo dono (chat 09/05/2026):
--      - Agente 278 (MARCO POLO MONTEIRO VIANA) → pct_parceiro
--      - Agente 417 (CODGOX)                     → pct_cliente_final
--      - Snapshots no tbl_Pedido/tbl_Faturamento são todos do agente 417
--    `pct_comissao` formalmente removido — auditoria confirmou zero linhas.
-- ---------------------------------------------------------------------

-- Cadastro do agente em tbl_Representante (idNatureza=3)
UPDATE tbl_Representante
   SET agente_modalidade = 'pct_parceiro'
 WHERE id = 278
   AND agente_modalidade = 'pct_venda';

UPDATE tbl_Representante
   SET agente_modalidade = 'pct_cliente_final'
 WHERE id = 417
   AND agente_modalidade = 'pct_venda';

-- Snapshots em tbl_Pedido (todos do agente 417 em revendas Standart)
UPDATE tbl_Pedido
   SET agente_modalidade_snap = 'pct_cliente_final'
 WHERE agente_cod_snap = 417
   AND agente_modalidade_snap = 'pct_venda';

-- Snapshot em tbl_Faturamento (também do agente 417)
UPDATE tbl_Faturamento
   SET agente_modalidade_snap = 'pct_cliente_final'
 WHERE agente_cod_snap = 417
   AND agente_modalidade_snap = 'pct_venda';

-- tbl_HistPedido tem 0 linhas com snap — UPDATE no-op por segurança
UPDATE tbl_HistPedido
   SET agente_modalidade_snap = 'pct_cliente_final'
 WHERE agente_modalidade_snap = 'pct_venda';

-- ---------------------------------------------------------------------
-- 2.5) Validação pós-UPDATE — RESSALVA-IGOR-01 (Security review COM#4)
--      MyISAM não tem ROLLBACK; conferir que 100% dos dados migraram
--      ANTES do ALTER ENUM (que rejeitaria valores inválidos).
--      Se qualquer SELECT abaixo retornar > 0, o ALTER falhará e a
--      operação inteira fica em estado parcial. Verificação manual:
--          SELECT * FROM tbl_Representante
--           WHERE agente_modalidade IN ('pct_venda','pct_comissao');
--          SELECT * FROM tbl_Pedido
--           WHERE agente_modalidade_snap IN ('pct_venda','pct_comissao');
--          SELECT * FROM tbl_Faturamento
--           WHERE agente_modalidade_snap IN ('pct_venda','pct_comissao');
--          SELECT * FROM tbl_HistPedido
--           WHERE agente_modalidade_snap IN ('pct_venda','pct_comissao');
--      Todos devem retornar 0 linhas. Caso contrário, abortar.
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- 3) ALTER ENUM nas 4 tabelas
--    Engines: tbl_Representante/tbl_Pedido/tbl_HistPedido = MyISAM (rebuild
--    rápido); tbl_Faturamento = InnoDB com 81k+ linhas — usar INPLACE
--    quando suportado.
-- ---------------------------------------------------------------------

ALTER TABLE tbl_Representante
  MODIFY COLUMN agente_modalidade
    ENUM('pct_parceiro','pct_cliente_final','tabela_preco')
    NULL DEFAULT NULL
    COMMENT 'Aplicavel quando idNatureza=3 (Agente). COM#4: renomeado em 09/05/2026.';

ALTER TABLE tbl_Pedido
  MODIFY COLUMN agente_modalidade_snap
    ENUM('pct_parceiro','pct_cliente_final','tabela_preco')
    NULL DEFAULT NULL
    COMMENT 'Snapshot do agente no momento do INSERT do pedido. COM#4: renomeado em 09/05/2026.';

ALTER TABLE tbl_Faturamento
  MODIFY COLUMN agente_modalidade_snap
    ENUM('pct_parceiro','pct_cliente_final','tabela_preco')
    NULL DEFAULT NULL
    COMMENT 'Snapshot propagado de tbl_Pedido por trigger ADR-0005. COM#4: renomeado em 09/05/2026.';

ALTER TABLE tbl_HistPedido
  MODIFY COLUMN agente_modalidade_snap
    ENUM('pct_parceiro','pct_cliente_final','tabela_preco')
    NULL DEFAULT NULL
    COMMENT 'Snapshot histórico propagado de tbl_Pedido por trigger ADR-0006. COM#4: renomeado em 09/05/2026.';

-- ---------------------------------------------------------------------
-- 4) CREATE triggers de propagação (idênticas em comportamento — só
--    o tipo da coluna mudou, lógica continua um IFNULL+SELECT puro)
-- ---------------------------------------------------------------------

-- ATENÇÃO: o runner sql/migrate.php (PDO) NÃO suporta DELIMITER. Triggers
-- abaixo seguem em single-statement (sem BEGIN/END). Se o runner falhar
-- na execução, aplicar via mysql cli interativo + register-applied
-- (regra dura registrada em memória `feedback_pdo_runner_nao_suporta_delimiter`).

CREATE TRIGGER trg_agente_snapshot_faturamento_bi
  BEFORE INSERT ON tbl_Faturamento
  FOR EACH ROW SET
    NEW.agente_cod_snap = IFNULL(NEW.agente_cod_snap, (SELECT p.agente_cod_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.pedido_id LIMIT 1)),
    NEW.agente_pct_snap = IFNULL(NEW.agente_pct_snap, (SELECT p.agente_pct_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.pedido_id LIMIT 1)),
    NEW.agente_modalidade_snap = IFNULL(NEW.agente_modalidade_snap, (SELECT p.agente_modalidade_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.pedido_id LIMIT 1));

CREATE TRIGGER trg_agente_snapshot_histpedido_bi
  BEFORE INSERT ON tbl_HistPedido
  FOR EACH ROW SET
    NEW.agente_cod_snap = IFNULL(NEW.agente_cod_snap, (SELECT p.agente_cod_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.cod_Pedido LIMIT 1)),
    NEW.agente_pct_snap = IFNULL(NEW.agente_pct_snap, (SELECT p.agente_pct_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.cod_Pedido LIMIT 1)),
    NEW.agente_modalidade_snap = IFNULL(NEW.agente_modalidade_snap, (SELECT p.agente_modalidade_snap FROM tbl_Pedido p WHERE p.cod_Pedido = NEW.cod_Pedido LIMIT 1));
