import { Row } from './types';

export function multiSelectFilter<TData>(row: Row<TData>, columnId: string, filterValue: string[]) {
  if (!Array.isArray(filterValue)) {
    return true;
  }

  const rowValue = row.getValue(columnId) as string;
  return filterValue.includes(rowValue);
}

export function dateSortingFn<TData>(rowA: Row<TData>, rowB: Row<TData>, columnId: string) {
  const dateStringA = rowA.getValue(columnId) as string;
  const dateStringB = rowB.getValue(columnId) as string;

  const parseCustomDate = (dateStr: string) => {
    if (!dateStr) {
      return new Date(Number.NaN);
    }

    const parts = dateStr.trim().split(' ');
    if (parts.length !== 3) {
      return new Date(Number.NaN);
    }

    const [day, month, year] = parts;

    const months: { [key: string]: string } = {
      Jan: '01',
      Feb: '02',
      Mar: '03',
      Apr: '04',
      May: '05',
      Jun: '06',
      Jul: '07',
      Aug: '08',
      Sep: '09',
      Oct: '10',
      Nov: '11',
      Dec: '12',
    };

    const monthNum = months[month];
    if (!monthNum) {
      return new Date(Number.NaN);
    }

    const isoDate = `${year}-${monthNum}-${day.padStart(2, '0')}`;
    return new Date(isoDate);
  };

  const dateA = parseCustomDate(dateStringA);
  const dateB = parseCustomDate(dateStringB);

  if (Number.isNaN(dateA.getTime()) && Number.isNaN(dateB.getTime())) {
    return 0;
  }
  if (Number.isNaN(dateA.getTime())) {
    return 1;
  }
  if (Number.isNaN(dateB.getTime())) {
    return -1;
  }

  return dateA.getTime() - dateB.getTime();
}

export function areArraysSame(a: (string | number)[], b: (string | number)[]): boolean {
  if (a.length !== b.length) return false;

  const countMap = new Map<string | number, number>();

  for (const value of a) {
    countMap.set(value, (countMap.get(value) || 0) + 1);
  }

  for (const value of b) {
    if (!countMap.has(value)) return false;

    countMap.set(value, countMap.get(value)! - 1);

    if (countMap.get(value)! < 0) return false;
  }

  return true;
}
