import { FieldSchema } from '@ephox/boulder';
import { Optional } from '@ephox/katamari';

import type { AlloyComponent } from '../../api/component/ComponentApi';
import * as Fields from '../../data/Fields';
import * as Bubble from '../layout/Bubble';
import * as LinkedLayout from '../layout/LinkedLayout';
import * as Origins from '../layout/Origins';

import { type Anchoring, nu as NuAnchoring, type SubmenuAnchor } from './Anchoring';
import * as AnchorLayouts from './AnchorLayouts';

const placement = (component: AlloyComponent, submenuInfo: SubmenuAnchor, origin: Origins.OriginAdt): Optional<Anchoring> => {
  const anchorBox = Origins.toBox(origin, submenuInfo.item.element);

  const layouts = AnchorLayouts.get(
    component.element,
    submenuInfo,
    LinkedLayout.all(),
    LinkedLayout.allRtl(),
    // No default bottomToTop layouts currently needed
    LinkedLayout.all(),
    LinkedLayout.allRtl(),
    Optional.none()
  );

  return Optional.some(
    NuAnchoring({
      anchorBox,
      bubble: Bubble.fallback(),
      overrides: submenuInfo.overrides,
      layouts
    })
  );
};

export default [
  FieldSchema.required('item'),
  AnchorLayouts.schema(),
  FieldSchema.defaulted('overrides', { }),
  Fields.output('placement', placement)
];
