import { MAX_MENU_SIZE_MULTIPLIER, MENU_MARGIN_FROM_APP_BORDER } from '@/Constants/Constants'

export type SubmenuStyle = {
  top?: number | 'auto'
  right?: number | 'auto'
  bottom: number | 'auto'
  left?: number | 'auto'
  visibility?: 'hidden' | 'visible'
  maxHeight: number | 'auto'
}

export const calculateSubmenuStyle = (
  button: HTMLButtonElement | null,
  menu?: HTMLDivElement | HTMLMenuElement | null,
): SubmenuStyle | undefined => {
  const defaultFontSize = window.getComputedStyle(document.documentElement).fontSize
  const maxChangeEditorMenuSize = parseFloat(defaultFontSize) * MAX_MENU_SIZE_MULTIPLIER
  const { clientWidth, clientHeight } = document.documentElement
  const buttonRect = button?.getBoundingClientRect()
  const buttonParentRect = button?.parentElement?.getBoundingClientRect()
  const menuBoundingRect = menu?.getBoundingClientRect()
  const footerElementRect = document.getElementById('footer-bar')?.getBoundingClientRect()
  const footerHeightInPx = footerElementRect?.height ?? 0

  let position: SubmenuStyle = {
    bottom: 'auto',
    maxHeight: 'auto',
  }

  if (buttonRect && buttonParentRect) {
    let positionBottom = clientHeight - buttonRect.bottom - buttonRect.height / 2

    if (positionBottom < footerHeightInPx) {
      positionBottom = footerHeightInPx + MENU_MARGIN_FROM_APP_BORDER
    }

    position = {
      bottom: positionBottom,
      visibility: 'hidden',
      maxHeight: 'auto',
    }

    if (buttonRect.right + maxChangeEditorMenuSize > clientWidth) {
      position.right = clientWidth - buttonRect.left
    } else {
      position.left = buttonRect.right
    }
  }

  if (menuBoundingRect?.height && buttonRect && position.bottom !== 'auto') {
    position.visibility = 'visible'

    if (menuBoundingRect.y < MENU_MARGIN_FROM_APP_BORDER) {
      position.bottom = position.bottom + menuBoundingRect.y - MENU_MARGIN_FROM_APP_BORDER * 2
    }

    if (footerElementRect && menuBoundingRect.height > footerElementRect.y) {
      position.bottom = footerElementRect.height + MENU_MARGIN_FROM_APP_BORDER
      position.maxHeight = clientHeight - footerElementRect.height - MENU_MARGIN_FROM_APP_BORDER * 2
    }
  }

  return position
}
