-- ==========================================
-- 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)
);

-- Admin (credenciales - solo tú)
CREATE TABLE IF NOT EXISTS admins (
  id INT AUTO_INCREMENT PRIMARY KEY,
  usuario VARCHAR(255) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  email VARCHAR(255),
  activo BOOLEAN DEFAULT TRUE,
  ultimo_acceso DATETIME,
  fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_usuario (usuario)
);

-- 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)
);

-- ==========================================
-- ESTRUCTURA DE EJEMPLO: campos_json
-- ==========================================
-- Los campos de un formulario se guardan como JSON:
-- [
--   {
--     "id": "campo_1",
--     "tipo": "escala_1_3",
--     "label": "¿Fue clara la información?",
--     "requerido": true,
--     "orden": 1
--   },
--   {
--     "id": "campo_2",
--     "tipo": "texto_corto",
--     "label": "Nombre",
--     "requerido": true,
--     "orden": 2,
--     "placeholder": "Ingresa tu nombre"
--   },
--   {
--     "id": "campo_3",
--     "tipo": "textarea",
--     "label": "Comentarios adicionales",
--     "requerido": false,
--     "orden": 3,
--     "placeholder": "Escribe aquí..."
--   },
--   {
--     "id": "campo_4",
--     "tipo": "checkbox",
--     "label": "¿Estás de acuerdo?",
--     "requerido": true,
--     "orden": 4
--   },
--   {
--     "id": "campo_5",
--     "tipo": "selector",
--     "label": "Selecciona una opción",
--     "requerido": true,
--     "orden": 5,
--     "opciones": ["Opción A", "Opción B", "Opción C"]
--   }
-- ]

-- ==========================================
-- INSERCIÓN INICIAL: Admin por defecto
-- ==========================================
-- Nota: Cambiar password después del primer login
-- Usuario: admin | Password: admin123 (hash: $2y$10$...)
INSERT INTO admins (usuario, password_hash, email, activo)
VALUES ('admin', '$2y$10$82Z6RHPGDfNPM6rqLJZxu.qFKjpWy.oZO0MrPZ9z7Y8KqUUPBpNVi', 'victor@example.com', TRUE)
ON DUPLICATE KEY UPDATE id=id;
