SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

SET @db_name = DATABASE();
SET @has_idx_ses_panel = (
  SELECT COUNT(*) FROM information_schema.statistics
  WHERE table_schema = @db_name AND table_name = 'sesiones_acceso' AND index_name = 'idx_sesiones_panel_estado_actividad'
);
SET @sql_idx_ses_panel = IF(@has_idx_ses_panel = 0,
  'ALTER TABLE `sesiones_acceso` ADD KEY `idx_sesiones_panel_estado_actividad` (`panel`, `estado`, `ultima_actividad_en`)',
  'SELECT 1'
);
PREPARE stmt_idx_ses_panel FROM @sql_idx_ses_panel;
EXECUTE stmt_idx_ses_panel;
DEALLOCATE PREPARE stmt_idx_ses_panel;

SET @has_idx_ses_device = (
  SELECT COUNT(*) FROM information_schema.statistics
  WHERE table_schema = @db_name AND table_name = 'sesiones_acceso' AND index_name = 'idx_sesiones_device_hash'
);
SET @sql_idx_ses_device = IF(@has_idx_ses_device = 0,
  'ALTER TABLE `sesiones_acceso` ADD KEY `idx_sesiones_device_hash` (`device_hash`)',
  'SELECT 1'
);
PREPARE stmt_idx_ses_device FROM @sql_idx_ses_device;
EXECUTE stmt_idx_ses_device;
DEALLOCATE PREPARE stmt_idx_ses_device;

SET @has_idx_trusted_revocado = (
  SELECT COUNT(*) FROM information_schema.statistics
  WHERE table_schema = @db_name AND table_name = 'trusted_devices' AND index_name = 'idx_trusted_devices_revocado'
);
SET @sql_idx_trusted_revocado = IF(@has_idx_trusted_revocado = 0,
  'ALTER TABLE `trusted_devices` ADD KEY `idx_trusted_devices_revocado` (`revocado_en`)',
  'SELECT 1'
);
PREPARE stmt_idx_trusted_revocado FROM @sql_idx_trusted_revocado;
EXECUTE stmt_idx_trusted_revocado;
DEALLOCATE PREPARE stmt_idx_trusted_revocado;

SET @has_idx_rec_panel = (
  SELECT COUNT(*) FROM information_schema.statistics
  WHERE table_schema = @db_name AND table_name = 'recuperacion_acceso' AND index_name = 'idx_recuperacion_panel_estado_expira'
);
SET @sql_idx_rec_panel = IF(@has_idx_rec_panel = 0,
  'ALTER TABLE `recuperacion_acceso` ADD KEY `idx_recuperacion_panel_estado_expira` (`panel`, `estado`, `expira_en`)',
  'SELECT 1'
);
PREPARE stmt_idx_rec_panel FROM @sql_idx_rec_panel;
EXECUTE stmt_idx_rec_panel;
DEALLOCATE PREPARE stmt_idx_rec_panel;

ALTER TABLE `access_attempts`
  MODIFY `tipo` ENUM(
    'login','logout','recuperacion','restablecer','mfa',
    'usuario_crear','usuario_actualizar','usuario_toggle','usuario_forzar_clave','usuario_roles_actualizar',
    'rol_crear','rol_actualizar','rol_toggle','rol_permisos_actualizar',
    'mfa_configurar','mfa_verificar','trusted_device','sesion_invalidar'
  ) NOT NULL,
  MODIFY `resultado` ENUM(
    'permitido','fallido','bloqueado','captcha_invalido','token_invalido','cuenta_inactiva','clave_invalida','sesion_cerrada','mfa_pendiente',
    'mfa_verificado','codigo_invalido','dispositivo_confiable','sesion_expirada','sesion_invalidada','configurado'
  ) NOT NULL;

INSERT INTO `permisos` (`codigo`, `nombre`, `descripcion`, `modulo`, `estado`, `creado_en`, `actualizado_en`)
VALUES
  ('sessions.read', 'Ver sesiones', 'Permite revisar sesiones abiertas, cerradas o invalidadas.', 'seguridad', 'activo', NOW(), NOW()),
  ('audit.read', 'Ver auditoría de acceso', 'Permite revisar la bitácora de acceso y gobierno base.', 'seguridad', 'activo', NOW(), NOW()),
  ('mfa.manage', 'Gestionar acceso reforzado', 'Permite preparar, regenerar y verificar la base de acceso reforzado.', 'seguridad', 'activo', NOW(), NOW())
ON DUPLICATE KEY UPDATE
  `nombre` = VALUES(`nombre`),
  `descripcion` = VALUES(`descripcion`),
  `modulo` = VALUES(`modulo`),
  `actualizado_en` = NOW();

INSERT INTO `rol_permisos` (`rol_id`, `permiso_id`, `asignado_por`, `creado_en`, `actualizado_en`)
SELECT r.id, p.id, NULL, NOW(), NOW()
FROM `roles` r
JOIN `permisos` p ON (
      r.codigo = 'superadmin_total'
   OR (r.codigo = 'acceso_seguridad' AND p.codigo IN ('sessions.read','audit.read','mfa.manage'))
   OR (r.codigo = 'seguimiento_general' AND p.codigo IN ('sessions.read','audit.read'))
   OR (r.codigo = 'solo_lectura' AND p.codigo IN ('sessions.read','audit.read'))
)
LEFT JOIN `rol_permisos` rp ON rp.rol_id = r.id AND rp.permiso_id = p.id
WHERE rp.id IS NULL;

SET FOREIGN_KEY_CHECKS = 1;
