-- Migration v55: Correção de clinica_id nulo + constraints adicionais
-- Motivo: Controllers antigos passavam $_SESSION['clinica_id'] sem fallback,
--         resultando em NULL explícito que viola NOT NULL apesar do DEFAULT 1.
--         Este migration repara dados existentes e reforça constraints no banco.

-- ======================================================
-- 1. REPARAR DADOS COM clinica_id NULL OU 0
-- ======================================================

UPDATE hospital_alas
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE hospital_leitos
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE hospital_internacoes
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE enfermagem_evolucoes
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE enfermagem_sinais_vitais
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE farmacia_dispensacoes
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE plantao_turnos
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE plantao_escalas
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE cc_salas
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE cc_cirurgias
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

UPDATE hospital_sumario_alta
    SET clinica_id = 1
    WHERE clinica_id IS NULL OR clinica_id = 0;

-- ======================================================
-- 2. GARANTIR DEFAULT 1 EM COLUNAS SEM DEFAULT
-- ======================================================

-- hospital_transferencias não tem clinica_id — adicionar para consistência
ALTER TABLE hospital_transferencias
    ADD COLUMN IF NOT EXISTS clinica_id INT NOT NULL DEFAULT 1 AFTER id;

UPDATE hospital_transferencias t
    JOIN hospital_internacoes i ON i.id = t.internacao_id
    SET t.clinica_id = i.clinica_id
    WHERE t.clinica_id = 0 OR t.clinica_id IS NULL;

-- ======================================================
-- 3. UNIQUE CONSTRAINT: número de leito por ala
--    (impede duplicar o mesmo número dentro da mesma ala)
-- ======================================================

-- Remove duplicatas antes de criar a constraint (mantém o registro mais antigo)
DELETE l1 FROM hospital_leitos l1
    INNER JOIN hospital_leitos l2
    WHERE l1.id > l2.id
      AND l1.ala_id  = l2.ala_id
      AND l1.numero  = l2.numero
      AND l1.ativo   = 1
      AND l2.ativo   = 1;

-- Cria constraint apenas se não existir
SET @idx := (
    SELECT COUNT(1) FROM information_schema.STATISTICS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME   = 'hospital_leitos'
      AND INDEX_NAME   = 'uq_leito_numero_ala'
);

SET @sql := IF(@idx = 0,
    'ALTER TABLE hospital_leitos ADD UNIQUE KEY uq_leito_numero_ala (ala_id, numero)',
    'SELECT "uq_leito_numero_ala já existe" AS info'
);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- ======================================================
-- 4. CHECAR se há registros de cc_cirurgias com clinica_id inválido
--    e vincular pela sala caso possível
-- ======================================================

UPDATE cc_cirurgias c
    JOIN cc_salas s ON s.id = c.sala_id
    SET c.clinica_id = s.clinica_id
    WHERE c.clinica_id = 1 AND s.clinica_id != 1;
