-- ==========================================
-- SCHEMA: Sistema de Encuestas Dinámicas
-- ==========================================

-- Campañas de evaluación
CREATE TABLE IF NOT EXISTS campanas (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(255) NOT NULL,
  descripcion TEXT,
  fecha_inicio DATE NOT NULL,
  fecha_fin DATE NOT NULL,
  estado ENUM('activa', 'pausada', 'cerrada') DEFAULT 'activa',
  fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_estado (estado),
  INDEX idx_fechas (fecha_inicio, fecha_fin)
);

-- Formularios (plantillas dinámicas)
CREATE TABLE IF NOT EXISTS formularios (
  id INT AUTO_INCREMENT PRIMARY KEY,
  campana_id INT NOT NULL,
  nombre VARCHAR(255) NOT NULL,
  descripcion TEXT,
  campos_json JSON NOT NULL,
  orden INT DEFAULT 0,
  activo BOOLEAN DEFAULT TRUE,
  fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (campana_id) REFERENCES campanas(id) ON DELETE CASCADE,
  INDEX idx_campana (campana_id),
  INDEX idx_activo (activo)
);

-- Usuarios evaluadores
CREATE TABLE IF NOT EXISTS usuarios_evaluadores (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(255) NOT NULL,
  rut VARCHAR(20),
  email VARCHAR(255),
  telefono VARCHAR(20),
  otro VARCHAR(255),
  fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_email (email),
  INDEX idx_rut (rut)
);

-- Tokens (vincula usuario + formulario + campaña)
CREATE TABLE IF NOT EXISTS tokens (
  id INT AUTO_INCREMENT PRIMARY KEY,
  campana_id INT NOT NULL,
  usuario_id INT NOT NULL,
  formulario_id INT NOT NULL,
  token_unico VARCHAR(128) NOT NULL UNIQUE,
  token_corto VARCHAR(12) NOT NULL UNIQUE,
  activo BOOLEAN DEFAULT TRUE,
  fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  usos INT DEFAULT 0,
  FOREIGN KEY (campana_id) REFERENCES campanas(id) ON DELETE CASCADE,
  FOREIGN KEY (usuario_id) REFERENCES usuarios_evaluadores(id) ON DELETE CASCADE,
  FOREIGN KEY (formulario_id) REFERENCES formularios(id) ON DELETE CASCADE,
  INDEX idx_token_corto (token_corto),
  INDEX idx_activo (activo),
  INDEX idx_usuario (usuario_id),
  INDEX idx_campana (campana_id)
);

-- Respuestas guardadas
CREATE TABLE IF NOT EXISTS respuestas (
  id INT AUTO_INCREMENT PRIMARY KEY,
  token_id INT NOT NULL,
  formulario_id INT NOT NULL,
  respuestas_json JSON NOT NULL,
  fecha_respuesta TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  ip_address VARCHAR(45),
  user_agent TEXT,
  FOREIGN KEY (token_id) REFERENCES tokens(id) ON DELETE CASCADE,
  FOREIGN KEY (formulario_id) REFERENCES formularios(id) ON DELETE CASCADE,
  INDEX idx_token (token_id),
  INDEX idx_formulario (formulario_id),
  INDEX idx_fecha (fecha_respuesta)
);

-- Logs de acceso (auditoría)
CREATE TABLE IF NOT EXISTS logs (
  id INT AUTO_INCREMENT PRIMARY KEY,
  tipo ENUM('formulario_enviado', 'admin_login', 'token_generado', 'campana_creada') NOT NULL,
  descripcion TEXT,
  usuario_id INT,
  ip_address VARCHAR(45),
  fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_tipo (tipo),
  INDEX idx_fecha (fecha)
);
