DROP DATABASE IF EXISTS atenea_congreso_2026;
CREATE DATABASE atenea_congreso_2026 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE atenea_congreso_2026;

CREATE TABLE roles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  slug VARCHAR(60) UNIQUE NOT NULL,
  nombre VARCHAR(120) NOT NULL,
  descripcion TEXT NULL,
  nivel INT NOT NULL DEFAULT 50,
  protected TINYINT(1) NOT NULL DEFAULT 0,
  costo DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE sedes (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(160) NOT NULL,
  ciudad VARCHAR(120) NULL,
  direccion VARCHAR(255) NULL,
  estado ENUM('activa','inactiva') DEFAULT 'activa'
) ENGINE=InnoDB;

CREATE TABLE carreras (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(160) NOT NULL,
  estado ENUM('activa','inactiva') DEFAULT 'activa'
) ENGINE=InnoDB;

CREATE TABLE ejes_tematicos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(180) NOT NULL,
  descripcion TEXT NULL,
  estado ENUM('activo','inactivo') DEFAULT 'activo'
) ENGINE=InnoDB;

CREATE TABLE usuarios (
  id INT AUTO_INCREMENT PRIMARY KEY,
  role_id INT NOT NULL,
  sede_id INT NULL,
  carrera_id INT NULL,
  dni_cedula_pasaporte VARCHAR(80) NULL,
  nombres VARCHAR(120) NOT NULL,
  apellidos VARCHAR(120) NOT NULL,
  institucion VARCHAR(180) NULL,
  email VARCHAR(160) UNIQUE NOT NULL,
  telefono VARCHAR(50) NULL,
  password VARCHAR(255) NOT NULL,
  estado ENUM('pendiente','aprobado','rechazado','bloqueado') DEFAULT 'pendiente',
  email_verified_at DATETIME NULL,
  remember_token VARCHAR(120) NULL,
  last_login_at DATETIME NULL,
  failed_logins INT NOT NULL DEFAULT 0,
  locked_until DATETIME NULL,
  mfa_enabled TINYINT(1) NOT NULL DEFAULT 0,
  mfa_secret VARCHAR(120) NULL,
  must_change_password TINYINT(1) NOT NULL DEFAULT 0,
  deleted_at DATETIME NULL,
  tipo_usuario VARCHAR(100) NULL,
  estado_usuario VARCHAR(50) DEFAULT 'pendiente',
  estado_pago VARCHAR(50) DEFAULT 'pendiente',
  estado_ponencia VARCHAR(50) DEFAULT 'sin_envio_ojs',
  requiere_ojs TINYINT(1) DEFAULT 0,
  ojs_validado TINYINT(1) DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY(role_id) REFERENCES roles(id),
  FOREIGN KEY(sede_id) REFERENCES sedes(id),
  FOREIGN KEY(carrera_id) REFERENCES carreras(id)
) ENGINE=InnoDB;

CREATE TABLE ponencias (
  id INT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NOT NULL,
  eje_id INT NULL,
  titulo VARCHAR(255) NOT NULL,
  resumen TEXT NULL,
  modalidad ENUM('virtual','presencial') DEFAULT 'presencial',
  tipo_trabajo ENUM('articulo','microarticulo','resumen') DEFAULT 'resumen',
  estado_ojs ENUM('pendiente','en_revision','correcciones','aprobado','rechazado') DEFAULT 'pendiente',
  ojs_submission_id VARCHAR(80) NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
  FOREIGN KEY(eje_id) REFERENCES ejes_tematicos(id)
) ENGINE=InnoDB;

CREATE TABLE pagos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NOT NULL,
  monto DECIMAL(10,2) NOT NULL DEFAULT 0,
  metodo VARCHAR(80) DEFAULT 'transferencia',
  comprobante_path VARCHAR(255) NULL,
  estado ENUM('pendiente','validado','rechazado') DEFAULT 'pendiente',
  observacion TEXT NULL,
  numero_factura VARCHAR(100) NULL,
  transaccion_id VARCHAR(150) NULL,
  validado_por INT NULL,
  validado_at DATETIME NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
  FOREIGN KEY(validado_por) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE agenda (
  id INT AUTO_INCREMENT PRIMARY KEY,
  sede_id INT NULL,
  titulo VARCHAR(220) NOT NULL,
  descripcion TEXT NULL,
  tipo VARCHAR(80) DEFAULT 'Ponencia',
  modalidad ENUM('presencial','virtual','hibrida') DEFAULT 'presencial',
  sala VARCHAR(120) NULL,
  fecha DATE NOT NULL,
  hora_inicio TIME NOT NULL,
  hora_fin TIME NOT NULL,
  stream_url VARCHAR(255) NULL,
  estado ENUM('borrador','publicado','oculto') DEFAULT 'publicado',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY(sede_id) REFERENCES sedes(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE notificaciones (
  id INT AUTO_INCREMENT PRIMARY KEY,
  titulo VARCHAR(180) NOT NULL,
  mensaje TEXT NOT NULL,
  role_id INT NULL,
  sede_id INT NULL,
  publicado_por INT NULL,
  estado ENUM('borrador','publicada','archivada') DEFAULT 'publicada',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY(role_id) REFERENCES roles(id) ON DELETE SET NULL,
  FOREIGN KEY(sede_id) REFERENCES sedes(id) ON DELETE SET NULL,
  FOREIGN KEY(publicado_por) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE qr_tokens (
  id INT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NOT NULL,
  tipo ENUM('credencial','coffee','asistencia','certificado') NOT NULL,
  referencia_id INT NULL,
  token VARCHAR(80) UNIQUE NOT NULL,
  estado ENUM('activo','usado','vencido','anulado') DEFAULT 'activo',
  expires_at DATETIME NULL,
  usado_at DATETIME NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE asistencias (
  id INT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NOT NULL,
  agenda_id INT NULL,
  tipo VARCHAR(60) NOT NULL,
  token VARCHAR(80) NULL,
  contexto VARCHAR(180) NULL,
  registrado_por INT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
  FOREIGN KEY(agenda_id) REFERENCES agenda(id) ON DELETE SET NULL,
  FOREIGN KEY(registrado_por) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE certificados (
  id INT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NOT NULL,
  tipo ENUM('participacion','ponencia','asistencia') DEFAULT 'participacion',
  codigo VARCHAR(60) UNIQUE NOT NULL,
  estado ENUM('emitido','descargado','anulado') DEFAULT 'emitido',
  emitido_por INT NULL,
  emitido_at DATETIME NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
  FOREIGN KEY(emitido_por) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE auditoria (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NULL,
  accion VARCHAR(120) NOT NULL,
  modulo VARCHAR(120) NULL,
  detalle TEXT NULL,
  ip VARCHAR(60) NULL,
  user_agent VARCHAR(255) NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE configuracion_evento (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(180) NOT NULL,
  fecha_inicio DATE NOT NULL,
  fecha_fin DATE NOT NULL,
  ciudad VARCHAR(120) NULL,
  descripcion TEXT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

INSERT INTO roles(slug,nombre,descripcion,costo) VALUES
('admin','Administrador','Acceso total al sistema',0.00),
('staff','Staff / Operador','Operación del congreso, pagos, QR y asistencia',0.00),
('ponente_virtual','Ponente Externo Virtual','Ponente virtual con acceso a sala, agenda y certificado',40.00),
('ponente_presencial','Ponente Externo Presencial','Ponente presencial con credencial, coffee break, agenda y certificado',60.00),
('estudiante_asistente','Estudiante ATENEA – Asistente','Estudiante asistente sin ponencia',20.00),
('estudiante_ponente','Estudiante ATENEA – Ponente','Estudiante con ponencia y beneficios de asistente',30.00);

INSERT INTO sedes(nombre,ciudad) VALUES
('Congreso ATENEA sede Quito-Ambato-Riobamba','Quito/Ambato/Riobamba'),
('Congreso ATENEA sede Santo Domingo-Quinindé','Santo Domingo/Quinindé'),
('Congreso ATENEA sede Machala','Machala'),
('Congreso ATENEA sede Cuenca','Cuenca'),
('Congreso ATENEA sede Cayambe','Cayambe'),
('Congreso ATENEA sede Loja','Loja');

INSERT INTO carreras(nombre) VALUES
('Administración'),('Educación'),('Enfermería'),('Tecnología'),('Otra');

INSERT INTO ejes_tematicos(nombre) VALUES
('Investigación e innovación'),('Transferencia del conocimiento'),('Educación y sociedad'),('Tecnología aplicada'),('Salud y bienestar');

INSERT INTO usuarios(role_id,nombres,apellidos,institucion,email,telefono,password,estado)
VALUES(1,'Administrador','General','CGE','admin@atenea.edu.ec','0980000000','$2y$12$fSpcAd32APLtVjHXfdCN2eCD3fuRKtMHcovXuAWqb50w9.oHVpvZ6','aprobado');

INSERT INTO configuracion_evento(nombre,fecha_inicio,fecha_fin,ciudad,descripcion)
VALUES('I Congreso Internacional ATENEA 2026','2026-07-15','2026-07-17','Quito - Ecuador','Investigación, Innovación y Transferencia del Conocimiento');

INSERT INTO agenda(titulo,descripcion,tipo,modalidad,sala,fecha,hora_inicio,hora_fin,estado) VALUES
('Inauguración del Congreso ATENEA 2026','Acto inaugural y bienvenida institucional','Inauguración','hibrida','Auditorio Principal','2026-07-15','09:00','10:00','publicado'),
('Panel de investigación e innovación','Panel académico con ponentes invitados','Panel','hibrida','Sala 1','2026-07-15','10:30','12:00','publicado');
-- =========================================================
-- MÓDULO SUPER ADMIN / ADMIN + ISO 27001/27002/27018
-- Compatible con instalación nueva y actualización incremental.
-- =========================================================

-- Las columnas correspondientes ya se agregan directamente en CREATE TABLE al inicio de este script.


CREATE TABLE IF NOT EXISTS permissions (
  id INT AUTO_INCREMENT PRIMARY KEY,
  slug VARCHAR(120) UNIQUE NOT NULL,
  nombre VARCHAR(160) NOT NULL,
  modulo VARCHAR(80) NOT NULL,
  descripcion TEXT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS role_permissions (
  role_id INT NOT NULL,
  permission_id INT NOT NULL,
  PRIMARY KEY(role_id, permission_id),
  FOREIGN KEY(role_id) REFERENCES roles(id) ON DELETE CASCADE,
  FOREIGN KEY(permission_id) REFERENCES permissions(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS audit_logs (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  event_uuid CHAR(36) UNIQUE NOT NULL,
  usuario_id INT NULL,
  accion VARCHAR(120) NOT NULL,
  modulo VARCHAR(120) NULL,
  detalle TEXT NULL,
  severity ENUM('info','warning','critical') DEFAULT 'info',
  entity_type VARCHAR(120) NULL,
  entity_id VARCHAR(80) NULL,
  ip VARCHAR(60) NULL,
  user_agent VARCHAR(255) NULL,
  metadata_json JSON NULL,
  prev_hash CHAR(64) NOT NULL,
  chain_hash CHAR(64) NOT NULL,
  created_at DATETIME NOT NULL,
  INDEX idx_audit_fecha(created_at),
  INDEX idx_audit_accion(accion),
  INDEX idx_audit_usuario(usuario_id),
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS system_backups (
  id INT AUTO_INCREMENT PRIMARY KEY,
  filename VARCHAR(255) NOT NULL,
  storage_path VARCHAR(500) NOT NULL,
  size_bytes BIGINT NOT NULL DEFAULT 0,
  checksum_sha256 CHAR(64) NOT NULL,
  tipo ENUM('manual','programado') DEFAULT 'manual',
  encrypted TINYINT(1) DEFAULT 0,
  created_by INT NULL,
  created_at DATETIME NOT NULL,
  FOREIGN KEY(created_by) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS iso_controls (
  id INT AUTO_INCREMENT PRIMARY KEY,
  standard VARCHAR(40) NOT NULL,
  codigo VARCHAR(40) UNIQUE NOT NULL,
  nombre VARCHAR(180) NOT NULL,
  objetivo TEXT NULL,
  estado ENUM('pendiente','parcial','implementado') DEFAULT 'pendiente',
  responsable VARCHAR(120) NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS iso_evidences (
  id INT AUTO_INCREMENT PRIMARY KEY,
  control_id INT NOT NULL,
  titulo VARCHAR(180) NOT NULL,
  descripcion TEXT NULL,
  archivo_path VARCHAR(500) NULL,
  estado ENUM('pendiente','validada','rechazada') DEFAULT 'pendiente',
  created_by INT NULL,
  created_at DATETIME NOT NULL,
  FOREIGN KEY(control_id) REFERENCES iso_controls(id) ON DELETE CASCADE,
  FOREIGN KEY(created_by) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

INSERT IGNORE INTO roles(slug,nombre,descripcion,nivel,protected) VALUES
('super_admin','SUPER ADMIN','Control total: usuarios, roles, permisos, auditoría, backups y SGSI.',1,1),
('auditor','Auditor / Compliance','Consulta de auditoría, evidencias ISO y reportes sin administración operativa.',20,1);

UPDATE roles SET nivel=5, protected=1 WHERE slug='admin';
UPDATE roles SET nivel=30, protected=1 WHERE slug='staff';

INSERT IGNORE INTO permissions(slug,nombre,modulo,descripcion) VALUES
('users.view','Ver usuarios','Usuarios','Consultar usuarios y estados'),
('users.create','Crear usuarios','Usuarios','Crear usuarios internos o externos'),
('users.edit','Editar usuarios','Usuarios','Modificar datos, rol, sede y estado'),
('users.delete','Eliminar/bloquear usuarios','Usuarios','Bloqueo o eliminación lógica'),
('users.approve','Aprobar/rechazar usuarios','Usuarios','Aprobación administrativa'),
('users.reset_password','Resetear contraseñas','Usuarios','Emisión de contraseña temporal'),
('roles.view','Ver roles','Roles y permisos','Consultar roles y permisos'),
('roles.create','Crear roles','Roles y permisos','Crear roles personalizados'),
('roles.edit','Editar roles/permisos','Roles y permisos','Modificar permisos de rol'),
('roles.delete','Eliminar roles','Roles y permisos','Eliminar roles no protegidos'),
('audit.view','Ver auditoría forense','Auditoría','Consultar bitácora forense'),
('audit.export','Exportar auditoría','Auditoría','Exportar evidencia CSV'),
('backups.view','Ver backups','Backups','Consultar copias de seguridad'),
('backups.create','Crear backups','Backups','Generar backup manual'),
('backups.download','Descargar backups','Backups','Descargar copia SQL'),
('backups.delete','Eliminar backups','Backups','Eliminar backup controlado'),
('iso.view','Ver matriz ISO','SGSI / ISO','Consultar matriz de controles internos'),
('iso.evidence','Registrar evidencias ISO','SGSI / ISO','Registrar evidencias de cumplimiento'),
('iso.export','Exportar matriz ISO','SGSI / ISO','Exportar matriz de cumplimiento'),
('payments.view','Ver pagos','Pagos','Consultar pagos'),
('payments.validate','Validar pagos','Pagos','Aprobar o rechazar pagos'),
('agenda.view','Ver agenda','Agenda','Consultar agenda académica'),
('agenda.edit','Gestionar agenda','Agenda','Crear y editar agenda'),
('notifications.view','Ver notificaciones','Notificaciones','Consultar notificaciones'),
('notifications.create','Crear notificaciones','Notificaciones','Publicar notificaciones'),
('certificates.view','Ver certificados','Certificados','Consultar certificados'),
('certificates.generate','Generar certificados','Certificados','Emitir certificados'),
('qr.scan','Escanear QR','QR','Validar credenciales, tickets y asistencia'),
('qr.use','Usar/registrar QR','QR','Marcar token como usado'),
('reports.export','Exportar reportes','Reportes','Exportar bases operativas');

-- SUPER ADMIN no necesita asignación: bypass por código.
-- ADMIN recibe todos los permisos.
INSERT IGNORE INTO role_permissions(role_id, permission_id)
SELECT r.id, p.id FROM roles r JOIN permissions p WHERE r.slug='admin';

-- STAFF recibe operación sin gobierno de roles, auditoría sensible ni backups.
INSERT IGNORE INTO role_permissions(role_id, permission_id)
SELECT r.id, p.id FROM roles r JOIN permissions p WHERE r.slug='staff' AND p.slug IN (
'users.view','users.approve','payments.view','payments.validate','agenda.view','agenda.edit','notifications.view','notifications.create','certificates.view','certificates.generate','qr.scan','qr.use','reports.export'
);

-- AUDITOR recibe consulta y exportación de evidencias.
INSERT IGNORE INTO role_permissions(role_id, permission_id)
SELECT r.id, p.id FROM roles r JOIN permissions p WHERE r.slug='auditor' AND p.slug IN ('audit.view','audit.export','iso.view','iso.export','reports.export');

INSERT IGNORE INTO usuarios(role_id,nombres,apellidos,institucion,email,telefono,password,estado,must_change_password)
SELECT id,'Super','Administrador','CGE','superadmin@atenea.edu.ec','0980000000','$2y$12$F3OPWHfb.TtsxrArjZmWxO4kW4jRovqX3GpJoEUOJbBs0bAiGhZg6','aprobado',1
FROM roles WHERE slug='super_admin';

INSERT IGNORE INTO iso_controls(standard,codigo,nombre,objetivo,estado,responsable) VALUES
('ISO/IEC 27001','ATN-ISO-001','Gobierno SGSI','Mantener políticas, responsabilidades y mejora continua del SGSI.', 'parcial','SUPER ADMIN'),
('ISO/IEC 27001','ATN-ISO-002','Gestión de riesgos','Identificar, evaluar y tratar riesgos sobre información del congreso.', 'pendiente','ADMIN'),
('ISO/IEC 27002','ATN-ISO-003','Control de acceso RBAC','Aplicar mínimos privilegios por rol y permiso.', 'implementado','SUPER ADMIN'),
('ISO/IEC 27002','ATN-ISO-004','Registro y monitoreo','Conservar logs forenses con trazabilidad e integridad.', 'implementado','SUPER ADMIN'),
('ISO/IEC 27002','ATN-ISO-005','Copias de seguridad','Generar, proteger y verificar backups de la base de datos.', 'parcial','ADMIN'),
('ISO/IEC 27002','ATN-ISO-006','Gestión de identidades','Controlar altas, bajas, bloqueos, contraseñas y MFA.', 'parcial','ADMIN'),
('ISO/IEC 27002','ATN-ISO-007','Seguridad operativa del evento','Proteger QR, certificados, pagos, asistencia y reportes.', 'parcial','STAFF'),
('ISO/IEC 27018','ATN-ISO-008','Protección de PII','Minimizar, proteger y auditar datos personales de participantes.', 'parcial','ADMIN'),
('ISO/IEC 27018','ATN-ISO-009','Privacidad y consentimiento','Registrar evidencias de consentimiento, finalidad y tratamiento de datos.', 'pendiente','ADMIN'),
('ISO/IEC 27018','ATN-ISO-010','Transparencia y auditoría de PII','Mantener evidencia exportable sobre acceso y tratamiento de PII.', 'parcial','AUDITOR');

-- =========================================================
-- INTEGRACIÓN OJS (OPEN JOURNAL SYSTEMS)
-- =========================================================

CREATE TABLE IF NOT EXISTS ojs_configuracion (
  id INT AUTO_INCREMENT PRIMARY KEY,
  ojs_url VARCHAR(255) NOT NULL,
  conferencia_nombre VARCHAR(255) NOT NULL,
  texto_instructivo TEXT NULL,
  modo_validacion ENUM('manual', 'api', 'csv') DEFAULT 'manual',
  permitir_registro_sin_aprobacion TINYINT(1) DEFAULT 0,
  soporte_email VARCHAR(150) NULL,
  soporte_whatsapp VARCHAR(50) NULL,
  activo TINYINT(1) DEFAULT 1,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS ponencias_ojs (
  id INT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NOT NULL,
  perfil_usuario VARCHAR(100) NOT NULL,
  codigo_ojs VARCHAR(100) UNIQUE NOT NULL,
  titulo_ponencia VARCHAR(255) NOT NULL,
  tipo_trabajo ENUM('articulo', 'microarticulo', 'resumen') NOT NULL,
  eje_tematico_id INT NOT NULL,
  sede_id INT NULL,
  modalidad ENUM('virtual', 'presencial') NOT NULL,
  estado_ponencia ENUM('sin_envio_ojs', 'enviado_ojs', 'en_revision', 'correcciones', 'aprobado_ojs', 'rechazado_ojs') DEFAULT 'enviado_ojs',
  archivo_aprobacion VARCHAR(255) NULL,
  archivo_ponencia VARCHAR(255) NULL,
  observacion_usuario TEXT NULL,
  observacion_admin TEXT NULL,
  fecha_envio_ojs DATETIME NULL,
  fecha_aprobacion_ojs DATETIME NULL,
  validado_por INT NULL,
  validado_at DATETIME NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
  FOREIGN KEY(eje_tematico_id) REFERENCES ejes_tematicos(id) ON DELETE RESTRICT,
  FOREIGN KEY(sede_id) REFERENCES sedes(id) ON DELETE SET NULL,
  FOREIGN KEY(validado_por) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS auditoria_ojs (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NULL,
  admin_id INT NULL,
  ponencia_id INT NULL,
  accion VARCHAR(100) NOT NULL,
  estado_anterior VARCHAR(50) NULL,
  estado_nuevo VARCHAR(50) NULL,
  descripcion TEXT NULL,
  ip VARCHAR(50) NULL,
  user_agent VARCHAR(255) NULL,
  hash_evento CHAR(64) NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY(usuario_id) REFERENCES usuarios(id) ON DELETE SET NULL,
  FOREIGN KEY(admin_id) REFERENCES usuarios(id) ON DELETE SET NULL,
  FOREIGN KEY(ponencia_id) REFERENCES ponencias_ojs(id) ON DELETE SET NULL
) ENGINE=InnoDB;

INSERT IGNORE INTO ojs_configuracion (id, ojs_url, conferencia_nombre, texto_instructivo, modo_validacion, permitir_registro_sin_aprobacion, soporte_email, soporte_whatsapp, activo)
VALUES (1, 'https://ojs.example.com', 'I Congreso Internacional ATENEA 2026', 'Por favor envíe su resumen o artículo en la plataforma OJS y copie aquí el código asignado por la plataforma.', 'manual', 0, 'soporte@atenea.edu.ec', '0990000000', 1);

