import type { ExtractPropTypes, StyleValue } from 'vue'
import type { switchProps, $constants } from '@/switch/src'
import type { ISharedRenderlessFunctionParams, ISharedRenderlessParamUtils } from './shared.type'
import type { toggle, computedWarpClasses, computedInnerClasses, computedStyle } from '../src/switch/index'

export interface ISwitchState {
  currentValue: string | number | boolean
  innerClasses: string
  wrapClasses: ISwitchClass
  style: StyleValue
  formDisabled: boolean
  disabled: boolean
  isDisplayOnly: boolean
  showText: boolean
}

export type ISwitchClass = Array<string | { [calssName: string]: boolean }>

export type ISwitchProps = ExtractPropTypes<typeof switchProps>

export type ISwitchConstants = typeof $constants

export type ISwitchRenderlessParams = ISharedRenderlessFunctionParams<ISwitchConstants> & {
  state: ISwitchState
  props: ISwitchProps
  prefixCls: string
}

export interface ISwitchApi {
  state: ISwitchState
  toggle: ReturnType<typeof toggle>
  computedWarpClasses: ReturnType<typeof computedWarpClasses>
  computedInnerClasses: ReturnType<typeof computedInnerClasses>
  computedStyle: ReturnType<typeof computedStyle>
}

export type ISwitchRenderlessParamUtils = ISharedRenderlessParamUtils<ISwitchConstants>