import type { ExtractPropTypes } from 'vue'
import type { ITabsVm, ITabsProps } from './tabs.type'
import type { ISharedRenderlessFunctionParams, ISharedRenderlessParamUtils } from './shared.type'
import type { tabNavPcProps } from '@/tabs/src/tab-nav'
import type {
  computedNavStyle,
  scrollIntoView,
  computedSizeName,
  updated,
  mounted,
  beforeUnmount,
  visibilityChangeHandler,
  windowBlurHandler,
  windowFocusHandler,
  scrollToActiveTab,
  scrollPrev,
  scrollNext,
  changeTab,
  setFocus,
  removeFocus,
  moreTabShow,
  expandTabShow,
  expandTabHide,
  computedHeaderStyle,
  handleTabDragStart,
  handleTabDragEnd,
  sortableEvent,
  watchCurrentName
} from '../src/tab-nav'

export type ITabNavProps = { _mode: string } & ExtractPropTypes<typeof tabNavPcProps> & ITabsProps

interface ITabNavStyle {}

interface ITabLineStyle {
  width: number
  offset: number
}

interface ITabNavScrollable {
  prev: number
  next: boolean
}

export interface ITabNavState {
  dragging: boolean
  navOffset: number
  lineStyle: ITabLineStyle
  scrollable: boolean | ITabNavScrollable
  isFocus: boolean
  focusable: boolean
  showMoreItem: boolean
  isActive: boolean
  showMoreTabs: boolean
  showExpandItem: boolean
  showExpandTabs: boolean
  expandHeaderStyle: {}
  mode: string
  rootTabs: ITabsVm
  sizeName: string
  navStyle: ITabNavStyle
  navSortableObj: object
  separator: boolean | null
}

export interface ITabNavApi {
  state: ITabNavState
  setFocus: ReturnType<typeof setFocus>
  removeFocus: ReturnType<typeof removeFocus>
  moreTabShow: ReturnType<typeof moreTabShow>
  expandTabShow: ReturnType<typeof expandTabShow>
  expandTabHide: ReturnType<typeof expandTabHide>
  scrollPrev: ReturnType<typeof scrollPrev>
  scrollNext: ReturnType<typeof scrollNext>
  windowBlurHandler: ReturnType<typeof windowBlurHandler>
  windowFocusHandler: ReturnType<typeof windowFocusHandler>
  visibilityChangeHandler: ReturnType<typeof visibilityChangeHandler>
  scrollToActiveTab: ReturnType<typeof scrollToActiveTab>
  scrollIntoView: ReturnType<typeof scrollIntoView>
  computedHeaderStyle: ReturnType<typeof computedHeaderStyle>
  watchCurrentName: ReturnType<typeof watchCurrentName>
  handleTabDragStart: ReturnType<typeof handleTabDragStart>
  handleTabDragEnd: ReturnType<typeof handleTabDragEnd>
  sortableEvent: ReturnType<typeof sortableEvent>
  computedSizeName: typeof computedSizeName
  computedNavStyle: typeof computedNavStyle
  beforeUnmount: typeof beforeUnmount
  mounted: typeof mounted
  changeTab: ReturnType<typeof changeTab>
  updated: ReturnType<typeof updated>
}

export type ITabNavRenderlessParamUtils = ISharedRenderlessParamUtils<never>

export type ITabNavRenderlessParams = ISharedRenderlessFunctionParams<never> & {
  state: ITabNavState
  props: ITabNavProps
  api: ITabNavApi
  rootTabs: ITabsVm
}