-- ============================================================================
-- PULSOCORP - BASE DE DATOS COMPLETA PARA INSTALACIÓN EN CPANEL / BANAHOSTING
-- ============================================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- 1. TABLA: roles
CREATE TABLE IF NOT EXISTS `roles` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `nombre` VARCHAR(60) NOT NULL UNIQUE,
  `descripcion` VARCHAR(255) NULL,
  `activo` TINYINT(1) DEFAULT 1,
  `fecha_creacion` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 2. TABLA: rol_permisos
CREATE TABLE IF NOT EXISTS `rol_permisos` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `rol_id` INT NOT NULL,
  `modulo` VARCHAR(50) NOT NULL,
  `puede_ver` TINYINT(1) DEFAULT 0,
  `puede_crear` TINYINT(1) DEFAULT 0,
  `puede_editar` TINYINT(1) DEFAULT 0,
  `puede_eliminar` TINYINT(1) DEFAULT 0,
  `puede_exportar` TINYINT(1) DEFAULT 0,
  UNIQUE KEY `uq_rol_modulo` (`rol_id`, `modulo`),
  CONSTRAINT `fk_rol_permisos_rol` FOREIGN KEY (`rol_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 3. TABLA: usuarios
CREATE TABLE IF NOT EXISTS `usuarios` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `nombre` VARCHAR(100) NOT NULL,
  `email` VARCHAR(100) NOT NULL UNIQUE,
  `PASSWORD` VARCHAR(255) NOT NULL,
  `rol` VARCHAR(60) NOT NULL DEFAULT 'usuario',
  `token_recuperacion` VARCHAR(255) NULL,
  `token_expiracion` DATETIME NULL,
  `fecha_creacion` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX `idx_usuarios_rol` (`rol`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 4. TABLA: sedes
CREATE TABLE IF NOT EXISTS `sedes` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `nombre` VARCHAR(100) NOT NULL,
  `direccion` VARCHAR(255) NULL,
  `activo` TINYINT(1) DEFAULT 1,
  `fecha_creacion` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 5. TABLA: horarios_sede
CREATE TABLE IF NOT EXISTS `horarios_sede` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `sede_id` INT NOT NULL,
  `dia_semana` TINYINT NOT NULL COMMENT '0=Domingo, 1=Lunes, 2=Martes, 3=Miercoles, 4=Jueves, 5=Viernes, 6=Sabado',
  `nombre_turno` VARCHAR(100) NOT NULL,
  `hora_inicio` TIME NOT NULL,
  `hora_fin` TIME NOT NULL,
  `activo` TINYINT(1) DEFAULT 1,
  `fecha_creacion` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX `idx_horarios_sede_dia` (`sede_id`, `dia_semana`),
  CONSTRAINT `fk_horarios_sede` FOREIGN KEY (`sede_id`) REFERENCES `sedes` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 6. TABLA: contadores (Catálogo de Redes)
CREATE TABLE IF NOT EXISTS `contadores` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `nombre` VARCHAR(100) NOT NULL UNIQUE,
  `contador` INT DEFAULT 0,
  `ultima_pulsacion` DATETIME NULL,
  INDEX `idx_contadores_nombre` (`nombre`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 7. TABLA: pulsaciones (Historial de Marcaciones)
CREATE TABLE IF NOT EXISTS `pulsaciones` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `nombre_persona` VARCHAR(100) NULL,
  `nombre_contador` VARCHAR(100) NULL,
  `fecha_hora` DATETIME NOT NULL,
  `ip_usuario` VARCHAR(50) NULL,
  `user_agent` TEXT NULL,
  `redes` INT NULL,
  `sede` INT NULL,
  `horario` INT NULL,
  INDEX `idx_pulsaciones_fecha_hora` (`fecha_hora`),
  INDEX `idx_pulsaciones_persona` (`nombre_persona`),
  INDEX `idx_pulsaciones_redes` (`redes`),
  INDEX `idx_pulsaciones_sede` (`sede`),
  INDEX `idx_pulsaciones_horario` (`horario`),
  CONSTRAINT `fk_pulsaciones_redes` FOREIGN KEY (`redes`) REFERENCES `contadores` (`id`) ON DELETE SET NULL,
  CONSTRAINT `fk_pulsaciones_sede` FOREIGN KEY (`sede`) REFERENCES `sedes` (`id`) ON DELETE SET NULL,
  CONSTRAINT `fk_pulsaciones_horario` FOREIGN KEY (`horario`) REFERENCES `horarios_sede` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================================
-- POBLADO DE DATOS INICIALES Y ROLES BASE
-- ============================================================================

-- Insertar Sede Central por Defecto (ID 2)
INSERT INTO `sedes` (`id`, `nombre`, `direccion`, `activo`) 
VALUES (2, 'Sede Central', 'Auditorio Principal', 1)
ON DUPLICATE KEY UPDATE `nombre` = VALUES(`nombre`);

-- Insertar Horarios Base
INSERT INTO `horarios_sede` (`id`, `sede_id`, `dia_semana`, `nombre_turno`, `hora_inicio`, `hora_fin`, `activo`) VALUES
(1, 2, 0, 'Turno Mañana (1er Reu)', '07:00:00', '13:30:00', 1),
(2, 2, 0, 'Turno Tarde (2do Reu)', '15:00:00', '21:30:00', 1)
ON DUPLICATE KEY UPDATE `nombre_turno` = VALUES(`nombre_turno`);

-- Insertar Roles Base
INSERT INTO `roles` (`id`, `nombre`, `descripcion`, `activo`) VALUES
(1, 'admin', 'Superadministrador con control y acceso total al sistema', 1),
(2, 'supervisor', 'Acceso de gestión a reportes, analítica, sedes y horarios', 1),
(3, 'auditor', 'Acceso exclusivo de solo lectura y auditoría de pulsaciones', 1),
(4, 'operador_turnos', 'Operador enfocado en clasificación de horarios y turnos', 1),
(5, 'ejecutivo', 'Visualización de resumen ejecutivo, KPIs y gráficos de alto nivel', 1)
ON DUPLICATE KEY UPDATE `descripcion` = VALUES(`descripcion`);

-- Insertar Matriz de Permisos para Roles Base
INSERT INTO `rol_permisos` (`rol_id`, `modulo`, `puede_ver`, `puede_crear`, `puede_editar`, `puede_eliminar`, `puede_exportar`) VALUES
-- Superadmin (admin)
(1, 'dashboard', 1, 1, 1, 1, 1),
(1, 'report_horarios', 1, 1, 1, 1, 1),
(1, 'report_redes', 1, 1, 1, 1, 1),
(1, 'report_fuera_horario', 1, 1, 1, 1, 1),
(1, 'detail', 1, 1, 1, 1, 1),
(1, 'pulsaciones', 1, 1, 1, 1, 1),
(1, 'sedes', 1, 1, 1, 1, 1),
(1, 'horarios', 1, 1, 1, 1, 1),
(1, 'contadores', 1, 1, 1, 1, 1),
(1, 'users', 1, 1, 1, 1, 1),
(1, 'roles', 1, 1, 1, 1, 1),

-- Supervisor
(2, 'dashboard', 1, 0, 0, 0, 1),
(2, 'report_horarios', 1, 0, 0, 0, 1),
(2, 'report_redes', 1, 0, 0, 0, 1),
(2, 'report_fuera_horario', 1, 0, 0, 0, 1),
(2, 'detail', 1, 0, 0, 0, 0),
(2, 'pulsaciones', 1, 0, 0, 0, 1),
(2, 'sedes', 1, 1, 1, 0, 0),
(2, 'horarios', 1, 1, 1, 0, 0),
(2, 'contadores', 1, 1, 1, 0, 0),
(2, 'users', 0, 0, 0, 0, 0),
(2, 'roles', 0, 0, 0, 0, 0),

-- Auditor
(3, 'dashboard', 1, 0, 0, 0, 0),
(3, 'report_horarios', 1, 0, 0, 0, 1),
(3, 'report_redes', 1, 0, 0, 0, 1),
(3, 'report_fuera_horario', 1, 0, 0, 0, 1),
(3, 'detail', 1, 0, 0, 0, 0),
(3, 'pulsaciones', 1, 0, 0, 0, 1),
(3, 'sedes', 1, 0, 0, 0, 0),
(3, 'horarios', 1, 0, 0, 0, 0),
(3, 'contadores', 1, 0, 0, 0, 0),
(3, 'users', 0, 0, 0, 0, 0),
(3, 'roles', 0, 0, 0, 0, 0),

-- Ejecutivo
(5, 'dashboard', 1, 0, 0, 0, 1),
(5, 'report_horarios', 0, 0, 0, 0, 0),
(5, 'report_redes', 1, 0, 0, 0, 1),
(5, 'report_fuera_horario', 0, 0, 0, 0, 0),
(5, 'detail', 1, 0, 0, 0, 0),
(5, 'pulsaciones', 0, 0, 0, 0, 0),
(5, 'sedes', 0, 0, 0, 0, 0),
(5, 'horarios', 0, 0, 0, 0, 0),
(5, 'contadores', 0, 0, 0, 0, 0),
(5, 'users', 0, 0, 0, 0, 0),
(5, 'roles', 0, 0, 0, 0, 0)
ON DUPLICATE KEY UPDATE `puede_ver` = VALUES(`puede_ver`);

-- Insertar Usuario Administrador Inicial
-- Credenciales: admin@contador.corp / Admin2026!
INSERT INTO `usuarios` (`id`, `nombre`, `email`, `PASSWORD`, `rol`)
VALUES (
  1,
  'Administrador Corporativo',
  'admin@contador.corp',
  '$2a$10$wN9aR.5Xv5m9j2Y9z8rK4u3N1p9L4q7M8y2z1w0x9v8u7t6s5r4q3',
  'admin'
)
ON DUPLICATE KEY UPDATE `nombre` = VALUES(`nombre`);

SET FOREIGN_KEY_CHECKS = 1;
