-- =====================================================================
-- MIGRATION 008  (Fase 10 — Hardening + Performance)
-- 1) users.must_change_password / password_changed_at:
--    permite forçar a troca de senha no primeiro acesso. Sem um flag
--    dedicado não há como exigir a troca de forma confiável (settings
--    exigiria consulta extra por request e não tem integridade). ALTER em
--    tabela existente — NENHUMA tabela nova.
-- 2) idx_demands_created (created_at): os relatórios estratégicos filtram
--    demandas por período (created_at). demands já tinha índices de status,
--    categoria, bairro, responsável e sla, mas não de created_at isolado.
--    As demais tabelas-alvo (tasks, audit_logs, message_outbox) JÁ possuem
--    os índices necessários — por isso nada é alterado nelas.
-- IDEMPOTENTE.
-- =====================================================================

DROP PROCEDURE IF EXISTS sgg_add_col;
DROP PROCEDURE IF EXISTS sgg_add_idx;
DELIMITER //
CREATE PROCEDURE sgg_add_col(IN tbl VARCHAR(64), IN col VARCHAR(64), IN ddl VARCHAR(255))
BEGIN
  IF NOT EXISTS (SELECT 1 FROM information_schema.columns
    WHERE table_schema=DATABASE() AND table_name=tbl AND column_name=col) THEN
    SET @s=CONCAT('ALTER TABLE `',tbl,'` ADD COLUMN ',ddl); PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
  END IF;
END //
CREATE PROCEDURE sgg_add_idx(IN tbl VARCHAR(64), IN idx VARCHAR(64), IN ddl VARCHAR(255))
BEGIN
  IF NOT EXISTS (SELECT 1 FROM information_schema.statistics
    WHERE table_schema=DATABASE() AND table_name=tbl AND index_name=idx) THEN
    SET @s=CONCAT('ALTER TABLE `',tbl,'` ADD ',ddl); PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
  END IF;
END //
DELIMITER ;

CALL sgg_add_col('users','must_change_password',"must_change_password TINYINT(1) NOT NULL DEFAULT 0 AFTER password_hash");
CALL sgg_add_col('users','password_changed_at',"password_changed_at DATETIME NULL AFTER must_change_password");
CALL sgg_add_idx('demands','idx_demands_created','KEY idx_demands_created (created_at)');

-- O admin padrão (seed) deve trocar a senha no primeiro acesso.
UPDATE users SET must_change_password = 1
  WHERE email = 'admin@admin.com' AND password_changed_at IS NULL;

DROP PROCEDURE IF EXISTS sgg_add_col;
DROP PROCEDURE IF EXISTS sgg_add_idx;
