import { Document } from "mongoose";
import * as env from "../config/env.config";

/**
 * Módulo para interpolar variables de usuario en plantillas de texto.
 *
 * Las plantillas usan la sintaxis `{{ variable }}` (Mustache-like).
 * Solo se reemplazan las variables de la lista blanca `allowedVars`;
 * cualquier otra variable permanece sin cambios en el texto.
 */

// Variables permitidas para interpolación. Solo se sustituyen estas claves
// para evitar exposición accidental de datos sensibles del usuario.
const allowedVars = new Set([
  "name",
  "lastName",
  "email",
  "document",
  "address",
]);

/**
 * Reemplaza las variables `{{ key }}` de un template con los datos del usuario.
 *
 * Solo interpola las claves declaradas en `allowedVars`. Si una variable no
 * está en la lista blanca, se devuelve tal cual (`{{variable}}`).
 * Si `input` es falsy, lo retorna sin modificar.
 *
 * @param input - Template de texto con marcadores `{{ variable }}`
 * @param user - Objeto de usuario con los campos a interpolar
 * @returns Template con las variables sustituidas por los valores del usuario
 */
export function parseTemplate(input: string, user: any): string {
  if (!input) return input;
  return input.replace(/\{\{\s*(\w+)\s*\}\}/g, (_m, v) => {
    if (!allowedVars.has(v)) return `{{${v}}}`; // mantener como está si no está permitida
    switch (v) {
      case "name":
        return user?.name ?? "";
      case "lastName":
        return user?.lastname ?? "";
      case "email":
        return user?.email ?? "";
      case "document":
        return user?.document ?? "";
      case "address":
        return user?.address ?? "";
      default:
        return "";
    }
  });
}

/**
 * Interpola las variables de usuario en el título y la descripción de una notificación.
 *
 * Aplica `parseTemplate` sobre ambos campos y devuelve los resultados juntos.
 *
 * @param title - Título de la notificación con posibles marcadores `{{ variable }}`
 * @param description - Descripción con posibles marcadores `{{ variable }}`
 * @param user - Objeto de usuario con los campos a interpolar
 * @returns Objeto con `title` y `description` ya interpolados
 */
export function parseTitleAndDescription(
  title: string,
  description: string,
  user: any,
) {
  return {
    title: parseTemplate(title, user),
    description: parseTemplate(description, user),
  };
}
