export type SortDirection = "asc" | "desc";

function normalize(value: unknown): string {
  return String(value ?? "")
    .normalize("NFD")
    .replace(/[\u0300-\u036f]/g, "")
    .toLowerCase();
}

export function matchesTableSearch(values: unknown[], query: string): boolean {
  const normalizedQuery = normalize(query).trim();
  if (!normalizedQuery) return true;

  return values.some((value) => normalize(value).includes(normalizedQuery));
}

export function compareTableValues(left: unknown, right: unknown): number {
  if (typeof left === "number" && typeof right === "number") {
    return left - right;
  }

  const leftDate = Date.parse(String(left));
  const rightDate = Date.parse(String(right));
  if (!Number.isNaN(leftDate) && !Number.isNaN(rightDate)) {
    return leftDate - rightDate;
  }

  return String(left ?? "").localeCompare(String(right ?? ""), "es", {
    sensitivity: "base",
    numeric: true,
  });
}

export function sortTableRows<T>(rows: T[], direction: SortDirection, getValue: (row: T) => unknown): T[] {
  const sorted = [...rows].sort((left, right) => compareTableValues(getValue(left), getValue(right)));
  return direction === "asc" ? sorted : sorted.reverse();
}
