import { createSelector } from '@reduxjs/toolkit';

import { unorderedArraysEqual } from '@/lib';

import { selectBoard } from './board';
import { getRemainingTiles } from './lib';
import { selectCharacters } from './rack';
import { selectConfig, selectLocale } from './settings';
import { selectLastSolvedParameters } from './solve';

const selectHasBoardChanged = createSelector(
  [selectLastSolvedParameters, selectBoard],
  (lastSolvedParameters, board) => {
    return !lastSolvedParameters.board.equals(board);
  },
);

const selectHaveCharactersChanged = createSelector(
  [selectLastSolvedParameters, selectCharacters, selectLocale],
  (lastSolvedParameters, characters, locale) => {
    return !unorderedArraysEqual(lastSolvedParameters.characters, characters, locale);
  },
);

export const selectAreResultsOutdated = createSelector(
  [selectHasBoardChanged, selectHaveCharactersChanged],
  (hasBoardChanged, haveCharactersChanged) => {
    return hasBoardChanged || haveCharactersChanged;
  },
);

export const selectRemainingTiles = createSelector(
  [selectConfig, selectBoard, selectCharacters, selectLocale],
  getRemainingTiles,
);
