import { omitText } from '@opentiny/utils'
import type { IStepsRenderlessParams, IStepsVisibleConfig, IStepsNodePosConfig } from '@/types'

export const updateStartIndex =
  ({ state, props }: Pick<IStepsRenderlessParams, 'state' | 'props'>) =>
  (): void => {
    const { visibleNum, active } = props
    const maxStartIndex = Math.min(props.data.length - visibleNum, active - Math.floor(visibleNum / 2))

    state.startIndex = Math.max(0, maxStartIndex)
  }

export const isVisibleHandler =
  ({ state, props }: Pick<IStepsRenderlessParams, 'state' | 'props'>) =>
  (index: number): IStepsVisibleConfig => {
    if (index < state.startIndex) {
      return 'hidden-left'
    } else if (index >= state.startIndex + props.visibleNum) {
      return 'hidden-right'
    } else {
      return 'visible'
    }
  }

export const computedRightNodePos =
  ({ state, props }: Pick<IStepsRenderlessParams, 'state' | 'props'>) =>
  (): IStepsNodePosConfig[] => {
    const { data } = props
    const { endIndex } = state
    const dataLength = data.length
    const nodesLength = dataLength - 1 - endIndex

    return Array.from({ length: nodesLength }).map((item, index) => ({
      zIndex: dataLength - index,
    }))
  }

export const handleMouseenter =
  ({ state, vm }: Pick<IStepsRenderlessParams, 'state' | 'vm'>) =>
  (e: MouseEvent, placement: string) => {
    const ele = e.target as HTMLElement
    const text = ele.textContent
    const font = window.getComputedStyle(ele).font
    const rect = ele.getBoundingClientRect()
    const res = omitText(text, font, rect.width)
    const popover = vm.$refs.popover

    if (res.o) {
      popover.state.referenceElm = ele
      popover.state.popperElm && (popover.state.popperElm.style.display = 'none')
      popover.doDestroy()

      state.popoverContent = text
      state.popoverVisible = true
      state.popoverPlacement = placement

      setTimeout(popover.updatePopper, 20)
    }
  }

export const handleMouseleave = (state: IStepsRenderlessParams['state']) => (): void => {
  state.popoverVisible = false
}

export const computedSpace = ({ props }: Pick<IStepsRenderlessParams, 'props'>): number | string => {
  const { space = '' } = props
  if (/^\d+$/.test(String(space))) {
    return `${space}px`
  }

  return space
}