-- Migration v101: Banco de Sangue — Integração Inter-Hospitalar (Hospitais Externos)
--
-- Contexto: Expande o módulo banco_sangue (v95/v96) com suporte a fornecimento
-- de bolsas de sangue para hospitais parceiros externos. Adiciona portal web
-- de acesso ao hospital, API REST autenticada por token, controle de pedidos,
-- estoque de saída, faturamento e pagamentos.

SET NAMES utf8mb4;

-- ─────────────────────────────────────────────────────────────────────────────
-- 1. Hospitais parceiros (clientes do banco de sangue)
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `bs_hospitais_parceiros` (
    `id`                INT          NOT NULL AUTO_INCREMENT,
    `clinica_id`        INT          NOT NULL COMMENT 'banco de sangue fornecedor',
    `nome`              VARCHAR(150) NOT NULL,
    `cnpj`              CHAR(14)     NOT NULL COMMENT 'apenas dígitos',
    `cnes`              VARCHAR(7)   NULL     COMMENT 'código CNES do hospital',
    `email`             VARCHAR(150) NULL,
    `telefone`          VARCHAR(20)  NULL,
    `whatsapp`          VARCHAR(20)  NULL,
    `endereco`          VARCHAR(200) NULL,
    `cidade`            VARCHAR(100) NULL,
    `estado`            CHAR(2)      NULL,
    `cep`               CHAR(8)      NULL,
    `contato_nome`      VARCHAR(100) NULL     COMMENT 'nome do responsável no hospital',
    `contato_email`     VARCHAR(150) NULL,
    `portal_usuario`    VARCHAR(100) NULL     COMMENT 'login para o portal web',
    `portal_senha_hash` VARCHAR(255) NULL     COMMENT 'bcrypt — null = sem acesso ao portal',
    `api_token_prefix`  VARCHAR(16)  NULL     COMMENT 'primeiros 16 chars do token para lookup rápido',
    `api_token_hash`    VARCHAR(64)  NULL     COMMENT 'SHA-256 hex do token completo',
    `limite_credito`    DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    `status`            ENUM('ativo','inativo','suspenso') NOT NULL DEFAULT 'ativo',
    `observacoes`       TEXT         NULL,
    `created_at`        DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`        DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uq_portal_usuario` (`portal_usuario`),
    UNIQUE KEY `uq_api_token_prefix` (`api_token_prefix`),
    INDEX `idx_clinica` (`clinica_id`),
    INDEX `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────────────────────
-- 2. Pedidos externos de bolsas de sangue
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `bs_pedidos_externos` (
    `id`                    INT         NOT NULL AUTO_INCREMENT,
    `clinica_id`            INT         NOT NULL,
    `hospital_id`           INT         NOT NULL,
    `numero_pedido`         VARCHAR(20) NOT NULL COMMENT 'ex: PED-2026-00001',
    `status`                ENUM('aguardando','aprovado','em_preparo','enviado','entregue','rejeitado')
                                        NOT NULL DEFAULT 'aguardando',
    `urgencia`              ENUM('normal','urgente','muito_urgente') NOT NULL DEFAULT 'normal',
    `tipo_entrega`          ENUM('retirada','entrega')            NOT NULL DEFAULT 'retirada',
    `data_necessidade`      DATE        NULL,
    `observacoes`           TEXT        NULL,
    `observacoes_internas`  TEXT        NULL COMMENT 'visível só para a equipe interna',
    `usuario_aprovacao_id`  INT         NULL,
    `data_aprovacao`        DATETIME    NULL,
    `origem`                ENUM('portal','api') NOT NULL DEFAULT 'portal',
    `ip_origem`             VARCHAR(45) NULL,
    `created_at`            DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`            DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uq_numero_pedido` (`numero_pedido`),
    INDEX `idx_clinica_hospital` (`clinica_id`, `hospital_id`),
    INDEX `idx_status` (`status`),
    INDEX `idx_created` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────────────────────
-- 3. Itens de cada pedido externo
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `bs_pedidos_itens` (
    `id`                    INT      NOT NULL AUTO_INCREMENT,
    `pedido_id`             INT      NOT NULL,
    `tipo_sanguineo`        ENUM('A','B','AB','O') NOT NULL,
    `fator_rh`              ENUM('+','-')           NOT NULL,
    `componente`            VARCHAR(100) NOT NULL,
    `quantidade_solicitada` SMALLINT UNSIGNED NOT NULL DEFAULT 1,
    `quantidade_aprovada`   SMALLINT UNSIGNED NULL,
    `hemocomponente_id`     INT      NULL COMMENT 'FK bs_hemocomponentes quando bolsa separada',
    PRIMARY KEY (`id`),
    INDEX `idx_pedido` (`pedido_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────────────────────
-- 4. Saídas de estoque (bolsas fisicamente entregues)
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `bs_saidas_estoque` (
    `id`                INT          NOT NULL AUTO_INCREMENT,
    `clinica_id`        INT          NOT NULL,
    `pedido_id`         INT          NOT NULL,
    `hemocomponente_id` INT          NOT NULL,
    `hospital_id`       INT          NOT NULL,
    `numero_bolsa`      VARCHAR(20)  NULL,
    `tipo_sanguineo`    VARCHAR(5)   NULL,
    `componente`        VARCHAR(50)  NULL,
    `volume_ml`         DECIMAL(7,2) NULL,
    `data_saida`        DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `usuario_id`        INT          NULL,
    `observacoes`       TEXT         NULL,
    PRIMARY KEY (`id`),
    INDEX `idx_pedido`   (`pedido_id`),
    INDEX `idx_hospital` (`hospital_id`),
    INDEX `idx_data`     (`data_saida`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────────────────────
-- 5. Faturas emitidas para hospitais parceiros
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `bs_faturas_externas` (
    `id`              INT           NOT NULL AUTO_INCREMENT,
    `clinica_id`      INT           NOT NULL,
    `hospital_id`     INT           NOT NULL,
    `pedido_id`       INT           NULL COMMENT 'NULL se fatura consolidada de múltiplos pedidos',
    `numero_fatura`   VARCHAR(20)   NOT NULL COMMENT 'ex: FAT-2026-00001',
    `valor_total`     DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    `status`          ENUM('aberta','parcial','quitada','cancelada') NOT NULL DEFAULT 'aberta',
    `data_vencimento` DATE          NULL,
    `data_emissao`    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `observacoes`     TEXT          NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uq_numero_fatura` (`numero_fatura`),
    INDEX `idx_clinica_hospital` (`clinica_id`, `hospital_id`),
    INDEX `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────────────────────
-- 6. Pagamentos recebidos contra faturas
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `bs_pagamentos_externos` (
    `id`              INT           NOT NULL AUTO_INCREMENT,
    `clinica_id`      INT           NOT NULL,
    `fatura_id`       INT           NOT NULL,
    `hospital_id`     INT           NOT NULL,
    `valor`           DECIMAL(10,2) NOT NULL,
    `data_pagamento`  DATE          NOT NULL,
    `forma_pagamento` ENUM('pix','transferencia','boleto','dinheiro','cheque') NOT NULL DEFAULT 'pix',
    `observacoes`     TEXT          NULL,
    `usuario_id`      INT           NULL,
    `created_at`      DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    INDEX `idx_fatura` (`fatura_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────────────────────
-- 7. Log de chamadas à API REST
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `bs_api_logs` (
    `id`          BIGINT      NOT NULL AUTO_INCREMENT,
    `hospital_id` INT         NULL,
    `clinica_id`  INT         NULL,
    `endpoint`    VARCHAR(200) NULL,
    `method`      VARCHAR(10) NULL,
    `status_code` SMALLINT    NULL,
    `ip`          VARCHAR(45) NULL,
    `user_agent`  VARCHAR(255) NULL,
    `created_at`  DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    INDEX `idx_hospital_data` (`hospital_id`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────────────────────
-- 8. Permissões do módulo
-- ─────────────────────────────────────────────────────────────────────────────
INSERT IGNORE INTO `permissoes` (`nome`, `chave`, `descricao`) VALUES
    ('BS - Hospitais Visualizar',         'banco_sangue_hospitais_view',        'Visualizar hospitais parceiros do banco de sangue'),
    ('BS - Hospitais Cadastrar',          'banco_sangue_hospitais_create',      'Cadastrar novo hospital parceiro'),
    ('BS - Hospitais Editar',             'banco_sangue_hospitais_edit',        'Editar hospital parceiro'),
    ('BS - Pedidos Externos Visualizar',  'banco_sangue_pedidos_ext_view',      'Visualizar pedidos externos de hemocomponentes'),
    ('BS - Pedidos Externos Aprovar',     'banco_sangue_pedidos_ext_aprovar',   'Aprovar ou rejeitar pedidos externos'),
    ('BS - Faturas Externas Visualizar',  'banco_sangue_faturas_ext_view',      'Visualizar faturas emitidas a hospitais parceiros'),
    ('BS - Faturas Externas Emitir',      'banco_sangue_faturas_ext_create',    'Emitir nova fatura a hospital parceiro'),
    ('BS - Faturas Externas Editar',      'banco_sangue_faturas_ext_edit',      'Editar fatura externa'),
    ('BS - Faturas Externas Pagamento',   'banco_sangue_faturas_ext_pagamento', 'Registrar pagamento de fatura externa');

-- ─────────────────────────────────────────────────────────────────────────────
-- 9. Atribuição de permissões ao perfil "Gestor do Hemocentro"
-- ─────────────────────────────────────────────────────────────────────────────
INSERT IGNORE INTO `perfil_permissoes` (`perfil_id`, `permissao_id`)
SELECT p.id, pm.id
FROM `perfis` p, `permissoes` pm
WHERE p.nome = 'Gestor do Hemocentro'
  AND pm.chave IN (
    'banco_sangue_hospitais_view',
    'banco_sangue_hospitais_create',
    'banco_sangue_hospitais_edit',
    'banco_sangue_pedidos_ext_view',
    'banco_sangue_pedidos_ext_aprovar',
    'banco_sangue_faturas_ext_view',
    'banco_sangue_faturas_ext_create',
    'banco_sangue_faturas_ext_edit',
    'banco_sangue_faturas_ext_pagamento'
);

SELECT 'Migration v101 aplicada com sucesso.' AS resultado;
