import testRange from './testRange';
import toNumber from '../toNumber';

const buildNumberTestBatch: BuildInputTestBatchFunction = (
  inputName,
  onSuccess,
  { onFinishBatch, ...defaults } = {},
  onIntTestFailure?,
  onFloatTestFailure?,
  onRangeTestFailure?,
) => {
  const tests: InputTest[] = [];

  if (onIntTestFailure) {
    tests.push({
      onFailure: (...args) => {
        onIntTestFailure(<>{inputName} must be a valid integer.</>, ...args);
      },
      test: ({ value }) => Number.isSafeInteger(toNumber(value)),
    });
  } else if (onFloatTestFailure) {
    tests.push({
      onFailure: (...args) => {
        onFloatTestFailure(
          <>{inputName} must be a valid floating-point number.</>,
          ...args,
        );
      },
      test: ({ value }) => Number.isFinite(toNumber(value, 'parseFloat')),
    });
  }

  if (onRangeTestFailure) {
    tests.push({
      onFailure: (...args) => {
        const { displayMax, displayMin } = args[0];

        onRangeTestFailure(
          <>
            {inputName} is expected to be between {displayMin} and {displayMax}.
          </>,
          ...args,
        );
      },
      test: testRange,
    });
  }

  return {
    defaults: { ...defaults, onSuccess },
    onFinishBatch,
    tests,
  };
};

export default buildNumberTestBatch;
