-- migrations/2026_01_05_migracao_pessoas_visitas.sql
-- Migração para separar Cadastro (pessoas) de Movimentação (visitas)
-- Compatível com o schema do arquivo rengoku_recepcao.sql

START TRANSACTION;

-- 1) Cadastro persistente
CREATE TABLE IF NOT EXISTS `pessoas` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `tipo` ENUM('VISITANTE','MUNICIPE') NOT NULL DEFAULT 'VISITANTE',

  `nome` VARCHAR(255) NOT NULL,
  `documento_numero` VARCHAR(50) NULL,
  `documento_orgao` VARCHAR(50) NULL,

  `telefone` VARCHAR(30) NULL,
  `email` VARCHAR(120) NULL,

  `data_nascimento` DATE NULL,

  `endereco` VARCHAR(255) NULL,

  `endereco_comercial` VARCHAR(255) NULL,
  `grau_escolaridade` VARCHAR(80) NULL,
  `atividade_profissional` VARCHAR(120) NULL,
  `dependentes_qtd` INT NULL,

  `foto_url` VARCHAR(255) NULL,
  `doc_url` VARCHAR(255) NULL,

  `biometria_template` LONGTEXT NULL,
  `biometria_dedo` INT DEFAULT 0,

  `observacoes` TEXT NULL,

  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_documento` (`documento_numero`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 2) Histórico de visitas
CREATE TABLE IF NOT EXISTS `visitas` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `pessoa_id` INT NOT NULL,
  `gabinete_id` INT NULL,
  `motivo` VARCHAR(255) NULL,

  `check_in` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `check_out` TIMESTAMP NULL DEFAULT NULL,

  `registrado_por` INT NOT NULL,

  `veiculo_modelo` VARCHAR(100) NULL,
  `veiculo_placa` VARCHAR(20) NULL,
  `materiais` TEXT NULL,

  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`),
  KEY `idx_visitas_periodo` (`check_in`),
  KEY `idx_visitas_pessoa` (`pessoa_id`),
  KEY `idx_visitas_gabinete` (`gabinete_id`),
  CONSTRAINT `fk_visitas_pessoa` FOREIGN KEY (`pessoa_id`) REFERENCES `pessoas`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
  CONSTRAINT `fk_visitas_gabinete` FOREIGN KEY (`gabinete_id`) REFERENCES `gabinetes`(`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `fk_visitas_user` FOREIGN KEY (`registrado_por`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 3) Cartões: passam a apontar para a VISITA ativa (e opcionalmente pessoa)
ALTER TABLE `access_cards`
  ADD COLUMN IF NOT EXISTS `current_visita_id` INT NULL AFTER `current_visitor_id`,
  ADD COLUMN IF NOT EXISTS `current_pessoa_id` INT NULL AFTER `current_visita_id`;

-- 4) Migração de dados (opcional): visitors -> pessoas/visitas
--    (não remove tabela antiga; você pode manter por auditoria/backup)
INSERT IGNORE INTO `pessoas` (`tipo`,`nome`,`documento_numero`,`foto_url`,`biometria_template`,`biometria_dedo`,`created_at`)
SELECT
  'VISITANTE',
  v.`full_name`,
  NULLIF(v.`document_id`, ''),
  v.`foto_url`,
  v.`biometria_template`,
  v.`biometria_dedo`,
  MIN(v.`check_in`)
FROM `visitors` v
GROUP BY v.`document_id`, v.`full_name`, v.`foto_url`, v.`biometria_template`, v.`biometria_dedo`;

-- cria visitas vinculando por documento (quando existir) e por nome (fallback)
INSERT INTO `visitas` (`pessoa_id`,`gabinete_id`,`motivo`,`check_in`,`check_out`,`registrado_por`,`veiculo_modelo`,`veiculo_placa`,`materiais`)
SELECT
  p.`id`,
  g.`id`,
  NULL,
  v.`check_in`,
  v.`check_out`,
  v.`registered_by`,
  v.`veiculo_modelo`,
  v.`veiculo_placa`,
  v.`materiais`
FROM `visitors` v
LEFT JOIN `gabinetes` g ON g.`nome` = v.`destination`
JOIN `pessoas` p
  ON (
    (p.`documento_numero` IS NOT NULL AND p.`documento_numero` = v.`document_id`)
    OR
    (p.`documento_numero` IS NULL AND p.`nome` = v.`full_name`)
  );

-- 5) Atualiza cartões para apontarem para a última visita ativa (se havia current_visitor_id)
UPDATE `access_cards` ac
JOIN `visitors` ov ON ov.`id` = ac.`current_visitor_id`
JOIN `pessoas` p ON (
  (p.`documento_numero` IS NOT NULL AND p.`documento_numero` = ov.`document_id`)
  OR (p.`documento_numero` IS NULL AND p.`nome` = ov.`full_name`)
)
LEFT JOIN `visitas` vi ON vi.`pessoa_id` = p.`id` AND vi.`check_out` IS NULL
SET
  ac.`current_pessoa_id` = p.`id`,
  ac.`current_visita_id` = vi.`id`
WHERE ac.`current_visitor_id` IS NOT NULL;

COMMIT;
