import { ColumnDef } from "@tanstack/react-table";
import { useEffect, useState } from "react";

// Función para calcular las columnas
export function useDataTableColumns<T extends object>(
  data: T[],
  extraColumns: ColumnDef<T>[] = []
): ColumnDef<T>[] {
  const [columns, setColumns] = useState<ColumnDef<T>[]>([]);

  useEffect(() => {
    if (!data || data.length === 0) {
      setColumns([]);
      return;
    }

    // Obtener las claves de todas las propiedades de todos los elementos
    const keys = data.reduce((acc: string[], item: T) => {
      return acc.concat(Object.keys(item));
    }, []);

    // Eliminar claves duplicadas y ordenarlas alfabéticamente
    const uniqueKeys = Array.from(new Set(keys)).sort();

    // Crear una columna para cada clave
    const calculatedColumns: ColumnDef<T>[] = uniqueKeys.map((key) => {
      return {
        id: key,
        header: key,
        accessorKey: key.toLowerCase().replace(/\s+/g, "_"),
      };
    });

    const finalColumns = extraColumns
      ? calculatedColumns.concat(extraColumns)
      : calculatedColumns;

    setColumns(finalColumns);
  }, [data, extraColumns]);

  return columns;
}
