import { useCallback, useState } from 'react';

type SortingState = { key: string; type: string; order: number };

const sortNumbers =
  <T extends Record<string, string | number>>(key: string) =>
  (a: T, b: T) => {
    let valueA = a[key];
    let valueB = b[key];
    valueA = typeof valueA === 'string' ? parseFloat(valueA) : valueA;
    valueB = typeof valueB === 'string' ? parseFloat(valueB) : valueB;
    return valueA > valueB ? 1 : valueA < valueB ? -1 : 0;
  };

const sortStrings =
  <T extends Record<string, string>>(key: string) =>
  (a: T, b: T) => {
    const valueA = a[key];
    const valueB = b[key];
    return valueA.localeCompare(valueB);
  };

const sorterFn = <T extends Record<string, any>>(
  data: T[],
  config: SortingState
) => {
  if (config.key === '') return data;
  const sorter =
    config.type === 'number'
      ? sortNumbers(config.key)
      : sortStrings(config.key);
  const sorted = data.sort(sorter);
  return config.order ? sorted.reverse() : sorted;
};

export function useTableSorting() {
  const [sorting, setSorting] = useState({ type: 'string', key: '', order: 0 });

  const handleSorting = useCallback((key: string, type: string) => {
    setSorting((s) => {
      if (s.key !== key) {
        return { type, key: key, order: 0 };
      } else {
        return { type, key: s.key, order: s.order ? 0 : 1 };
      }
    });
  }, []);

  return [sorting, handleSorting, sorterFn] as const;
}
