import { Arr, Optional } from '@ephox/katamari';

import type { Gene } from '../api/Gene';

import * as Comparator from './Comparator';
import * as Detach from './Detach';
import * as Up from './Up';

const unwrap = (item: Gene): void => {
  item.parent.each((parent) => {
    const children = item.children;
    Arr.each(children, (child) => {
      child.parent = Optional.some(parent);
    });

    const index = Arr.findIndex(parent.children, (sibling) => {
      return Comparator.eq(sibling, item);
    });

    index.fold(() => {
      parent.children = parent.children.concat(children);
    }, (ind) => {
      parent.children = parent.children.slice(0, ind).concat(children).concat(parent.children.slice(ind + 1));
    });
  });
};

const remove = (item: Gene): void => {
  detach(item);
};

const detach = (item: Gene): void => {
  Detach.detach(Up.top(item), item);
};

export {
  unwrap,
  remove,
  detach
};
