-- =============================================================================
-- 01_estructura_y_datos.sql — Esquema completo + datos de ejemplo
-- Uso en phpMyAdmin:
--   1. Seleccione la base `rpm_asistencia` (Importar / SQL).
--   2. Ejecute este archivo completo.
-- Ideal para base NUEVA o vacía. Si ya tenía tablas antiguas, mejor use
--   scripts/init_db.php con PHP o revise 02_alter_migraciones.sql
-- Contraseñas semilla: ADMINISTRADOR / ADMIN123  |  EMPLEADO / EMP123
-- (hashes bcrypt generados con PHP password_hash; si re-ejecuta init_db.php
--  los hashes pueden cambiar pero las contraseñas son las mismas.)
-- =============================================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ---------------------------------------------------------------------------
-- Tablas base (orden por dependencias de claves foráneas)
-- ---------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS `proyectos` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `nombre` VARCHAR(150) NOT NULL,
  `codigo` VARCHAR(40) NULL DEFAULT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `uq_proyecto_codigo` (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `contratistas` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `nombre` VARCHAR(150) NOT NULL,
  `ruc` VARCHAR(20) NOT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `uq_contratista_ruc` (`ruc`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `users` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(50) NOT NULL,
  `role` ENUM('ADMINISTRADOR','EMPLEADO') NOT NULL,
  `password_hash` VARCHAR(255) NOT NULL,
  `is_active` TINYINT(1) NOT NULL DEFAULT 1,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `access_scope` ENUM('GLOBAL','PROJECT') NULL DEFAULT NULL,
  `proyecto_id` INT NULL DEFAULT NULL,
  UNIQUE KEY `uq_users_username` (`username`),
  KEY `idx_users_proyecto` (`proyecto_id`),
  CONSTRAINT `fk_users_proyectoScope` FOREIGN KEY (`proyecto_id`) REFERENCES `proyectos` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `trabajadores` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `nombre` VARCHAR(150) NOT NULL,
  `dni` VARCHAR(20) NOT NULL,
  `contratista_id` INT NOT NULL,
  `proyecto_id` INT NOT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `uq_trabajador_dni_global` (`dni`),
  KEY `idx_trabajador_contratista` (`contratista_id`),
  KEY `idx_trabajador_proyecto` (`proyecto_id`),
  CONSTRAINT `fk_trabajador_contratista` FOREIGN KEY (`contratista_id`) REFERENCES `contratistas` (`id`) ON DELETE RESTRICT,
  CONSTRAINT `fk_trabajador_proyecto` FOREIGN KEY (`proyecto_id`) REFERENCES `proyectos` (`id`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `asistencias` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `trabajador_id` INT NOT NULL,
  `contratista_id` INT NOT NULL,
  `proyecto_id` INT NOT NULL,
  `fecha_hora` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `tipo` ENUM('entrada','salida') NOT NULL,
  `foto` VARCHAR(500) NOT NULL,
  KEY `idx_asistencia_trabajador_fecha` (`trabajador_id`, `fecha_hora`),
  KEY `idx_asistencia_proyecto_fecha` (`proyecto_id`, `fecha_hora`),
  CONSTRAINT `fk_asistencia_trabajador` FOREIGN KEY (`trabajador_id`) REFERENCES `trabajadores` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_asistencia_contratista` FOREIGN KEY (`contratista_id`) REFERENCES `contratistas` (`id`) ON DELETE RESTRICT,
  CONSTRAINT `fk_asistencia_proyecto` FOREIGN KEY (`proyecto_id`) REFERENCES `proyectos` (`id`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `trabajador_modificaciones_historial` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `trabajador_id` INT NOT NULL,
  `campo` VARCHAR(32) NOT NULL,
  `valor_anterior` TEXT NOT NULL,
  `valor_nuevo` TEXT NOT NULL,
  `usuario_admin_id` INT NULL DEFAULT NULL,
  `usuario_admin_username` VARCHAR(50) NULL DEFAULT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY `idx_trabajador_modif_trab` (`trabajador_id`),
  CONSTRAINT `fk_trabajador_modif_trab` FOREIGN KEY (`trabajador_id`) REFERENCES `trabajadores` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_trabajador_modif_user` FOREIGN KEY (`usuario_admin_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

SET FOREIGN_KEY_CHECKS = 1;

-- ---------------------------------------------------------------------------
-- Datos mínimos: proyectos, contratista, usuarios (ADMIN123 / EMP123), trabajadores demo
-- ---------------------------------------------------------------------------

INSERT INTO `proyectos` (`nombre`, `codigo`) VALUES ('Obra general', 'GEN-01')
ON DUPLICATE KEY UPDATE `nombre` = VALUES(`nombre`);

INSERT INTO `proyectos` (`nombre`, `codigo`) VALUES ('Obra RGM demo', 'RGM-DEMO')
ON DUPLICATE KEY UPDATE `nombre` = VALUES(`nombre`);

INSERT INTO `contratistas` (`nombre`, `ruc`) VALUES ('RGM Constructora SAC', '20123456789')
ON DUPLICATE KEY UPDATE `nombre` = VALUES(`nombre`);

-- Hashes bcrypt para ADMIN123 y EMP123 (PHP PASSWORD_BCRYPT, XAMPP)
INSERT INTO `users` (`username`, `role`, `password_hash`, `is_active`, `access_scope`, `proyecto_id`)
VALUES
  ('ADMINISTRADOR', 'ADMINISTRADOR', '$2y$10$rFjxkrX2i723rVdSyVPt8eBQUc.u/hz0LYD8cus1svn8HInSAiEIK', 1, NULL, NULL),
  ('EMPLEADO', 'EMPLEADO', '$2y$10$WAGW7z/vhMaTdUw5Yz/Q2eBZwIt0PvgMPKX7OMUwGC1OE2aRNbsh6', 1, NULL, NULL)
ON DUPLICATE KEY UPDATE
  `role` = VALUES(`role`),
  `password_hash` = VALUES(`password_hash`),
  `is_active` = VALUES(`is_active`);

SET @cid := (SELECT `id` FROM `contratistas` WHERE `ruc` = '20123456789' LIMIT 1);
SET @pid := (SELECT `id` FROM `proyectos` WHERE `codigo` = 'RGM-DEMO' LIMIT 1);

INSERT INTO `trabajadores` (`nombre`, `dni`, `contratista_id`, `proyecto_id`)
VALUES
  ('Juan Pérez García', '12345678', @cid, @pid),
  ('María López Díaz', '87654321', @cid, @pid)
ON DUPLICATE KEY UPDATE
  `nombre` = VALUES(`nombre`),
  `contratista_id` = VALUES(`contratista_id`),
  `proyecto_id` = VALUES(`proyecto_id`);

-- Nota: ON DUPLICATE KEY en trabajadores requiere conflicto por UNIQUE(dni).
-- Si falla el INSERT por DNI duplicado, los registros ya existen; puede ignorar.
