-- ============================================================
-- Migration v96 — Expansão Banco de Sangue
-- Recepção, Autoexclusão, Liberação Formal, Expedição,
-- Pool de Plaquetas, Irradiação, ISBT 128
-- ============================================================

SET SQL_MODE   = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone  = "+00:00";
SET NAMES utf8mb4;

-- ------------------------------------------------------------
-- Campos adicionais em bs_hemocomponentes
-- ------------------------------------------------------------
ALTER TABLE `bs_hemocomponentes`
    ADD COLUMN IF NOT EXISTS `processo`          enum('normal','lavado','filtrado','irradiado','pool') DEFAULT 'normal' AFTER `tipo`,
    ADD COLUMN IF NOT EXISTS `irradiado`         tinyint(1) DEFAULT 0 AFTER `processo`,
    ADD COLUMN IF NOT EXISTS `data_irradiacao`   datetime DEFAULT NULL AFTER `irradiado`,
    ADD COLUMN IF NOT EXISTS `pool_ids`          text DEFAULT NULL COMMENT 'IDs das bolsas que formaram o pool' AFTER `data_irradiacao`,
    ADD COLUMN IF NOT EXISTS `liberado`          tinyint(1) DEFAULT 0 AFTER `pool_ids`,
    ADD COLUMN IF NOT EXISTS `data_liberacao`    datetime DEFAULT NULL AFTER `liberado`,
    ADD COLUMN IF NOT EXISTS `usuario_liberacao` int(11) DEFAULT NULL AFTER `data_liberacao`,
    ADD COLUMN IF NOT EXISTS `codigo_isbt`       varchar(30) DEFAULT NULL AFTER `numero_componente`;

-- ------------------------------------------------------------
-- Recepção de Doadores
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bs_recepcoes` (
  `id`                  int(11) NOT NULL AUTO_INCREMENT,
  `clinica_id`          int(11) NOT NULL,
  `doador_id`           int(11) NOT NULL,
  `usuario_id`          int(11) NOT NULL,
  `data_recepcao`       datetime NOT NULL,
  `tipo_doacao`         enum('espontanea','reposicao','autologa','dirigida') NOT NULL DEFAULT 'espontanea',
  `paciente_beneficiario` varchar(100) DEFAULT NULL COMMENT 'Para doações dirigidas/reposição',
  `material_solicitado` enum('sangue_total','plaquetas','plasma','hemacias') DEFAULT 'sangue_total',
  `motivo`              varchar(255) DEFAULT NULL,
  -- Validações automáticas registradas
  `idade_anos`          int(11) DEFAULT NULL,
  `apto_idade`          tinyint(1) DEFAULT 1,
  `apto_intervalo`      tinyint(1) DEFAULT 1,
  `dias_desde_ultima`   int(11) DEFAULT NULL,
  `apto_sorologico`     tinyint(1) DEFAULT 1,
  `apto_triagem_previa` tinyint(1) DEFAULT 1,
  -- Resultado da recepção
  `resultado`           enum('liberado','inapto_intervalo','inapto_idade','inapto_sorologico','inapto_triagem','recusado') DEFAULT 'liberado',
  `motivo_recusa`       varchar(255) DEFAULT NULL,
  `observacoes`         text DEFAULT NULL,
  `data_cadastro`       timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_bs_rec_doador`   (`doador_id`),
  KEY `idx_bs_rec_clinica`  (`clinica_id`),
  KEY `idx_bs_rec_data`     (`data_recepcao`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Autoexclusão Pós-Doação (confidencial — RDC 34/2014)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bs_autoexclusoes` (
  `id`              int(11) NOT NULL AUTO_INCREMENT,
  `clinica_id`      int(11) NOT NULL,
  `coleta_id`       int(11) NOT NULL,
  `doador_id`       int(11) NOT NULL,
  `data_registro`   datetime NOT NULL,
  -- O doador responde APÓS a doação, em sigilo
  `deseja_excluir`  tinyint(1) NOT NULL DEFAULT 0 COMMENT '1 = sangue NÃO deve ser usado',
  `motivo_codigo`   enum('comportamento_risco','sintoma_recente','medicamento','outro') DEFAULT NULL,
  `observacoes`     text DEFAULT NULL,
  -- Processado pelo sistema
  `processado`      tinyint(1) DEFAULT 0,
  `data_processamento` datetime DEFAULT NULL,
  `usuario_processamento` int(11) DEFAULT NULL,
  `data_cadastro`   timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_bs_autoexc_coleta`  (`coleta_id`),
  KEY `idx_bs_autoexc_doador`  (`doador_id`),
  KEY `idx_bs_autoexc_clinica` (`clinica_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Expedição de Hemocomponentes
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bs_expedicoes` (
  `id`                  int(11) NOT NULL AUTO_INCREMENT,
  `clinica_id`          int(11) NOT NULL,
  `numero_expedicao`    varchar(20) NOT NULL,
  `usuario_id`          int(11) NOT NULL,
  `data_expedicao`      datetime NOT NULL,
  `tipo`                enum('saida','devolucao') DEFAULT 'saida',
  `destino`             varchar(150) DEFAULT NULL COMMENT 'Hospital/serviço destino',
  `paciente_id`         int(11) DEFAULT NULL,
  `requisicao_id`       int(11) DEFAULT NULL,
  `responsavel_retirada` varchar(100) DEFAULT NULL,
  `observacoes`         text DEFAULT NULL,
  `status`              enum('pendente','confirmada','cancelada') DEFAULT 'pendente',
  `data_cadastro`       timestamp NOT NULL DEFAULT current_timestamp(),
  `ultima_atualizacao`  timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_numero_expedicao` (`numero_expedicao`, `clinica_id`),
  KEY `idx_bs_exp_clinica` (`clinica_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `bs_expedicao_itens` (
  `id`                 int(11) NOT NULL AUTO_INCREMENT,
  `expedicao_id`       int(11) NOT NULL,
  `hemocomponente_id`  int(11) NOT NULL,
  `volume_ml`          int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_bs_exp_item_exp`  (`expedicao_id`),
  KEY `idx_bs_exp_item_hemo` (`hemocomponente_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Config ISBT por clínica
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bs_config_isbt` (
  `id`               int(11) NOT NULL AUTO_INCREMENT,
  `clinica_id`       int(11) NOT NULL,
  `codigo_banco`     varchar(10) NOT NULL DEFAULT 'BS' COMMENT 'Prefixo do banco (ex: HEMO, BS)',
  `formato`          enum('isbt128','sequencial','personalizado') DEFAULT 'sequencial',
  `ultimo_sequencial` int(11) DEFAULT 0,
  `mascara`          varchar(30) DEFAULT '{BANCO}{ANO}{SEQ6}' COMMENT 'Máscara para formato personalizado',
  `data_cadastro`    timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_bs_config_clinica` (`clinica_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Inaptidão Sorológica (registro formal para bloqueio)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bs_inaptidoes_sorologicas` (
  `id`              int(11) NOT NULL AUTO_INCREMENT,
  `clinica_id`      int(11) NOT NULL,
  `doador_id`       int(11) NOT NULL,
  `teste_id`        int(11) NOT NULL COMMENT 'ID do bs_testes_sorologicos',
  `exame`           varchar(30) NOT NULL COMMENT 'Campo que resultou reagente',
  `data_registro`   datetime NOT NULL,
  `permanente`      tinyint(1) DEFAULT 1,
  `data_expiracao`  date DEFAULT NULL COMMENT 'Se temporária, data de liberação',
  `observacoes`     text DEFAULT NULL,
  `ativo`           tinyint(1) DEFAULT 1,
  `data_cadastro`   timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_bs_inap_sor_doador`  (`doador_id`),
  KEY `idx_bs_inap_sor_clinica` (`clinica_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Permissões adicionais
-- ------------------------------------------------------------
INSERT IGNORE INTO `permissoes` (`nome`, `chave`, `descricao`) VALUES
('Banco de Sangue - Recepção',          'banco_sangue_recepcao',       'Atender recepção de doadores'),
('Banco de Sangue - Autoexclusão',      'banco_sangue_autoexclusao',   'Gerenciar autoexclusões pós-doação'),
('Banco de Sangue - Liberar Bolsas',    'banco_sangue_liberacao',      'Liberar formalmente bolsas para uso'),
('Banco de Sangue - Expedição',         'banco_sangue_expedicao',      'Registrar expedição de hemocomponentes'),
('Banco de Sangue - Pool/Irradiação',   'banco_sangue_processo',       'Processar pool de plaquetas e irradiação'),
('Banco de Sangue - Config ISBT',       'banco_sangue_config',         'Configurar ISBT e parâmetros do banco'),
('Banco de Sangue - Relatórios BS',     'banco_sangue_relatorios_full','Relatórios gerenciais completos do banco de sangue');
