-- 1. Categorias
CREATE TABLE IF NOT EXISTS estoque_categorias (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    descricao TEXT,
    ativo TINYINT(1) DEFAULT 1,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 2. Unidades de Medida
CREATE TABLE IF NOT EXISTS estoque_unidades_medida (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(50) NOT NULL,
    sigla VARCHAR(10) NOT NULL,
    fator_conversao DECIMAL(10,4) DEFAULT 1.0000 COMMENT 'Fator para converter para unidade base',
    ativo TINYINT(1) DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 3. Almoxarifados
CREATE TABLE IF NOT EXISTS estoque_almoxarifados (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    tipo VARCHAR(50) DEFAULT 'CENTRAL' COMMENT 'CENTRAL, FARMACIA, SATELITE',
    cnpj_vinculado VARCHAR(20) DEFAULT NULL COMMENT 'Para multi-clínicas',
    unidade_id INT DEFAULT NULL COMMENT 'ID da clinica_id ou unidade',
    ativo TINYINT(1) DEFAULT 1,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 4. Fornecedores
CREATE TABLE IF NOT EXISTS estoque_fornecedores (
    id INT AUTO_INCREMENT PRIMARY KEY,
    razao_social VARCHAR(150) NOT NULL,
    nome_fantasia VARCHAR(150),
    cnpj VARCHAR(20),
    telefone VARCHAR(20),
    email VARCHAR(100),
    ativo TINYINT(1) DEFAULT 1,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 5. Produtos
CREATE TABLE IF NOT EXISTS estoque_produtos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    codigo_barras VARCHAR(50) DEFAULT NULL,
    descricao VARCHAR(255) NOT NULL,
    categoria_id INT,
    unidade_medida_id INT,
    is_medicamento TINYINT(1) DEFAULT 0,
    lote_obrigatorio TINYINT(1) DEFAULT 1,
    estoque_minimo INT DEFAULT 0,
    estoque_maximo INT DEFAULT NULL,
    -- Faturamento Convênios (TISS)
    codigo_tuss VARCHAR(50) DEFAULT NULL,
    tabela_referencia VARCHAR(50) DEFAULT NULL COMMENT 'BRASINDICE, SIMPRO, PROPRIA',
    codigo_referencia VARCHAR(50) DEFAULT NULL,
    valor_faturamento DECIMAL(10,2) DEFAULT NULL,
    
    ativo TINYINT(1) DEFAULT 1,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    atualizado_em DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (categoria_id) REFERENCES estoque_categorias(id),
    FOREIGN KEY (unidade_medida_id) REFERENCES estoque_unidades_medida(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 6. Saldos Fixos e Controle Transacional
CREATE TABLE IF NOT EXISTS estoque_saldos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    almoxarifado_id INT NOT NULL,
    produto_id INT NOT NULL,
    lote VARCHAR(50) DEFAULT NULL,
    data_validade DATE DEFAULT NULL,
    quantidade DECIMAL(12,4) NOT NULL DEFAULT 0.0000,
    valor_unitario_custo DECIMAL(10,2) DEFAULT 0.00,
    atualizado_em DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY unq_saldo (almoxarifado_id, produto_id, lote),
    FOREIGN KEY (almoxarifado_id) REFERENCES estoque_almoxarifados(id),
    FOREIGN KEY (produto_id) REFERENCES estoque_produtos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 7. Movimentações Transacionais
CREATE TABLE IF NOT EXISTS estoque_movimentacoes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tipo_movimentacao VARCHAR(50) NOT NULL COMMENT 'COMPRA, CONSUMO, TRANSFERENCIA_SAIDA, TRANSFERENCIA_ENTRADA, AJUSTE_ENTRADA, AJUSTE_SAIDA, PERDA, DEVOLUCAO',
    almoxarifado_id INT NOT NULL,
    produto_id INT NOT NULL,
    lote VARCHAR(50) DEFAULT NULL,
    quantidade DECIMAL(12,4) NOT NULL,
    valor_unitario DECIMAL(10,2) DEFAULT NULL,
    valor_total DECIMAL(10,2) DEFAULT NULL,
    
    -- Vínculos Hospitalares/Atendimento
    paciente_id INT DEFAULT NULL,
    atendimento_id INT DEFAULT NULL,
    procedimento_id INT DEFAULT NULL,
    
    -- Vínculos Financeiros/Origem
    fornecedor_id INT DEFAULT NULL,
    numero_nota_fiscal VARCHAR(50) DEFAULT NULL,
    
    -- Transferência
    movimentacao_vinculada_id INT DEFAULT NULL COMMENT 'ID da mov vinculada (saida/entrada correlata)',
    
    -- Auditoria
    observacao TEXT,
    usuario_id INT NOT NULL,
    data_hora DATETIME DEFAULT CURRENT_TIMESTAMP,
    ip VARCHAR(45) DEFAULT NULL,
    
    FOREIGN KEY (almoxarifado_id) REFERENCES estoque_almoxarifados(id),
    FOREIGN KEY (produto_id) REFERENCES estoque_produtos(id),
    FOREIGN KEY (fornecedor_id) REFERENCES estoque_fornecedores(id),
    FOREIGN KEY (movimentacao_vinculada_id) REFERENCES estoque_movimentacoes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 8. Inventários (Auditoria e Contagem)
CREATE TABLE IF NOT EXISTS estoque_inventarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    almoxarifado_id INT NOT NULL,
    data_abertura DATETIME DEFAULT CURRENT_TIMESTAMP,
    data_fechamento DATETIME DEFAULT NULL,
    status VARCHAR(20) DEFAULT 'ABERTO' COMMENT 'ABERTO, EM_CONTAGEM, FECHADO, CANCELADO',
    usuario_abertura_id INT NOT NULL,
    usuario_fechamento_id INT DEFAULT NULL,
    observacoes TEXT,
    FOREIGN KEY (almoxarifado_id) REFERENCES estoque_almoxarifados(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 9. Itens do Inventário
CREATE TABLE IF NOT EXISTS estoque_inventario_itens (
    id INT AUTO_INCREMENT PRIMARY KEY,
    inventario_id INT NOT NULL,
    produto_id INT NOT NULL,
    lote VARCHAR(50) DEFAULT NULL,
    quantidade_sistema DECIMAL(12,4) NOT NULL,
    quantidade_contada DECIMAL(12,4) DEFAULT NULL,
    diferenca DECIMAL(12,4) DEFAULT NULL,
    status_item VARCHAR(20) DEFAULT 'PENDENTE' COMMENT 'PENDENTE, CONTADO, AJUSTADO',
    usuario_contagem_id INT DEFAULT NULL,
    data_contagem DATETIME DEFAULT NULL,
    FOREIGN KEY (inventario_id) REFERENCES estoque_inventarios(id),
    FOREIGN KEY (produto_id) REFERENCES estoque_produtos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Inserindo Almoxarifado Central Padrão
INSERT INTO estoque_almoxarifados (nome, tipo) VALUES ('Almoxarifado Central', 'CENTRAL');

-- Inserindo Unidades de Medida Padrão
INSERT INTO estoque_unidades_medida (nome, sigla, fator_conversao) VALUES 
('Unidade', 'UN', 1.0000),
('Caixa', 'CX', 1.0000),
('Ampola', 'AMP', 1.0000),
('Frasco', 'FRS', 1.0000),
('Comprimido', 'CP', 1.0000);

-- Inserindo Categorias Padrão
INSERT INTO estoque_categorias (nome, descricao) VALUES 
('Medicamentos', 'Medicamentos em geral'),
('Material Médico-Hospitalar (Mat/Med)', 'Materiais descartáveis e de uso hospitalar'),
('OPME', 'Órteses, Próteses e Materiais Especiais'),
('Limpeza e Higiene', 'Materiais de limpeza do ambiente hospitalar/clínico'),
('Expediente / Papelaria', 'Materiais e impressos de escritório');
