/**
 * Utilidades para el DocumentTable
 */

/**
 * Formatea valores complejos para mostrar en la tabla
 */
export const formatComplexValue = (value: unknown): string => {
  if (value === null || value === undefined) return "";
  if (
    typeof value === "string" ||
    typeof value === "number" ||
    typeof value === "boolean"
  ) {
    return String(value);
  }
  if (Array.isArray(value)) {
    return value
      .map((item) =>
        typeof item === "object" ? JSON.stringify(item) : String(item)
      )
      .join(", ");
  }
  if (typeof value === "object") {
    return JSON.stringify(value, null, 2);
  }
  return String(value);
};

/**
 * Verifica si un valor es complejo (objeto o array)
 */
export const isComplexValue = (value: unknown): boolean => {
  return (typeof value === "object" && value !== null) || Array.isArray(value);
};

/**
 * Verifica si un texto es largo (>50 caracteres)
 */
export const isLongText = (value: unknown): boolean => {
  if (typeof value !== "string") return false;
  return value.length > 50;
};

/**
 * Obtiene una vista previa del valor
 */
export const getPreview = (value: unknown): string => {
  if (value === null || value === undefined) return "Sin datos";
  if (Array.isArray(value)) {
    return value.length === 0 ? "Lista vacía" : `${value.length} elemento(s)`;
  }
  if (typeof value === "object") {
    const keys = Object.keys(value);
    return keys.length === 0 ? "Objeto vacío" : `${keys.length} campo(s)`;
  }
  return String(value);
};

/**
 * Busca un valor en extractedData ignorando mayúsculas/minúsculas
 */
export const findInExtractedData = (
  data: Record<string, unknown> | undefined,
  keys: string[]
): string => {
  if (!data) return "";
  for (const key of keys) {
    const found = Object.entries(data).find(
      ([k]) => k.toLowerCase().replace(/[_\s-]/g, "") === key.toLowerCase().replace(/[_\s-]/g, "")
    );
    if (found && found[1] != null) {
      return String(found[1]);
    }
  }
  return "";
};

/**
 * Filtro fuzzy para búsqueda de texto
 */
export const fuzzyFilter = (
  row: any,
  columnId: string,
  value: string,
  addMeta: (meta: { itemRank: any }) => void
) => {
  const { rankItem } = require('@tanstack/match-sorter-utils');
  const cellValue = formatComplexValue(row.getValue(columnId));
  const itemRank = rankItem(cellValue, value);
  addMeta({ itemRank });
  return itemRank.passed;
};
