/**
 * 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 { isObject, isNull } from '@opentiny/utils'

export const getRouteActive =
  ({ props, route }) =>
  () => {
    if (props.to && route) {
      const config = isObject(props.to) ? props.to : { path: props.to }
      const pathMatched = config.path === route.path
      const nameMatched = !isNull(config.name) && config.name === route.name

      return pathMatched || nameMatched
    }
  }

export const onClick =
  ({ api, emit, parent, props, router, state, dispatch }) =>
  (event) => {
    dispatch('Tabbar', 'activeItem', props.name || parent.index || state.index)

    emit('click', event)

    api.routeTab(router)
  }

export const bindChildren =
  ({ parent, vm, dispatch }) =>
  () => {
    if (!parent.$parent) {
      return
    }

    dispatch('Tabbar', 'updateItems', vm)
    dispatch('Tabbar', 'showIndex')
  }

export const routeTab = (props, state) => (router) => {
  const { to, replace } = props
  const { url } = state

  if (to && router) {
    const promise = router[replace ? 'replace' : 'push'](to)

    if (promise && promise.catch) {
      promise.catch((err) => {
        if (err && err.name !== 'NavigationDuplicated') {
          throw err
        }
      })
    }
  } else if (url) {
    replace ? location.replace(url) : (location.href = url)
  }
}

export const getTabbarItemsWidth = (state) => (tabbarWidth, tabbarNumber) => {
  state.itemWidth = tabbarWidth / tabbarNumber + 'px'
}