/**
 * Copyright (c) 2022 - present TinyVue Authors.
 * Copyright (c) 2022 - present Huawei Cloud Computing Technologies Co., Ltd.
 *
 * Use of this source code is governed by an MIT-style license.
 *
 * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
 * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
 * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
 *
 */

import type { ICascaderMenuRenderlessParams, ICascaderMenuState } from '@/types'

export const handleExpand = (state: ICascaderMenuState) => (e: MouseEvent) =>
  (state.activeNode = e.target as HTMLElement)

export const handleMouseMove =
  ({
    api,
    parent,
    vm,
    state,
    svg
  }: Pick<ICascaderMenuRenderlessParams, 'api' | 'parent' | 'state' | 'vm'> & {
    svg: string
  }) =>
  (e: MouseEvent) => {
    const hoverZone = vm.$refs.hoverZone

    if (!state.activeNode || !hoverZone) {
      return
    }

    if (state.activeNode.contains(e.target as HTMLElement)) {
      if (state.hoverTimer) {
        clearTimeout(state.hoverTimer)
      }

      const { left } = vm.$refs.cascaderMenu.$parent.$el.getBoundingClientRect()
      const startX = e.clientX - left
      const { offsetWidth, offsetHeight } = vm.$refs.cascaderMenu.$parent.$el
      const top = state.activeNode.offsetTop
      const bottom = top + state.activeNode.offsetHeight

      hoverZone.innerHTML = `
      ${svg}${startX} ${top} L${offsetWidth} 0 V${top} Z" />
      ${svg}${startX} ${bottom} L${offsetWidth} ${offsetHeight} V${bottom} Z" />
    `
    } else if (!state.hoverTimer) {
      state.hoverTimer = setTimeout(api.clearHoverZone, parent.$parent.state.config.hoverThreshold)
    }
  }

export const clearHoverZone =
  ({ vm }: Pick<ICascaderMenuRenderlessParams, 'vm'>) =>
  () => {
    const { hoverZone } = vm.$refs.hoverZone

    if (!hoverZone) {
      return
    }

    hoverZone.innerHTML = ''
  }