import type { Optional } from '@ephox/katamari';
import { type Direction, Gather } from '@ephox/phoenix';

import * as WordUtil from '../util/WordUtil';

export interface WordWalking extends Direction {
  slicer: (text: string) => Optional<[number, number]>;
}

const walkers = Gather.walkers();

const left = walkers.left();
const right = walkers.right();

const breakToLeft = (text: string): Optional<[number, number]> => {
  return WordUtil.leftBreak(text).map((index) => {
    return [ index + 1, text.length ];
  });
};

const breakToRight = (text: string): Optional<[number, number]> => {
  // Will need to generalise the word breaks.
  return WordUtil.rightBreak(text).map((index) => {
    return [ 0, index ];
  });
};

export const WordWalking = {
  left: {
    sibling: left.sibling,
    first: left.first,
    slicer: breakToLeft
  },
  right: {
    sibling: right.sibling,
    first: right.first,
    slicer: breakToRight
  }
};
