/**
 * 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 {
  IActionSheetApi,
  IActionSheetState,
  IActionSheetProps,
  ISharedRenderlessParamHooks,
  IActionSheetRenderlessParamUtils
} from '@/types'
import {
  setSheetStyle,
  initScrollMenu,
  visibleHandle,
  watchVisible,
  menuHandle,
  close,
  selectOption,
  confirm,
  actionSelectOption,
  hide,
  handleClose
} from './index'

export const api = [
  'state',
  'setSheetStyle',
  'initScrollMenu',
  'visibleHandle',
  'watchVisible',
  'menuHandle',
  'close',
  'selectOption',
  'confirm',
  'actionSelectOption',
  'hide'
]

export const renderless = (
  props: IActionSheetProps,
  { reactive, watch }: ISharedRenderlessParamHooks,
  { emit, nextTick, refs, vm }: IActionSheetRenderlessParamUtils,
  { BScroll }
): IActionSheetApi => {
  const state = reactive<IActionSheetState>({
    toggle: false,
    sheetMaskStyle: {},
    sheetContentStyle: {},
    scroll: null
  })

  const api: IActionSheetApi = {} as IActionSheetApi
  Object.assign(api, {
    state,
    setSheetStyle: setSheetStyle({ state, props }),
    initScrollMenu: initScrollMenu({ state, nextTick, refs, BScroll }),
    visibleHandle: visibleHandle({ emit, state }),
    watchVisible: watchVisible({ emit, state }),
    menuHandle: menuHandle({ state, emit }),
    confirm: confirm({ state, api }),
    selectOption: selectOption({ emit, props }),
    actionSelectOption: actionSelectOption({ emit }),
    hide: hide({ api }),
    close: close({ api }),
    handleClose: handleClose({ vm, emit, props })
  })

  watch(
    () => props.visible,
    (value) => {
      if (value) {
        api.setSheetStyle({ state, props })
        api.initScrollMenu({ state, nextTick, refs, BScroll })
      }
      api.watchVisible(value)
    }
  )

  watch(() => props.visible, api.watchVisible, { immediate: true })

  return api
}