import type { ExtractPropTypes } from 'vue'
import type { pagerProps } from '@/pager/src'
import type { ISharedRenderlessFunctionParams, ISharedRenderlessParamUtils } from './shared.type'
import type {
  computedShowPager,
  computedInternalLayout,
  computedTotalText,
  computedInternalPageCount,
  handleJumperFocus,
  handleSizeChange,
  handleJumperInput,
  handleJumperChange,
  handleJumperClick,
  isValueNumber,
  parseValueNumber,
  handleSizeShowPopover,
  handleSizeHidePopover,
  canJumperGo,
  beforeSizeChangeHandler,
  beforePagerChangeHandler,
  copyEmit,
  beforeChangeHandler,
  handleCurrentChange,
  prev,
  next,
  buildBeforePageChangeParam,
  getValidCurrentPage,
  emitChange,
  setTotal,
  clickSizes,
  watchInternalCurrentPage,
  watchCurrentPage,
  watchInternalPageCount,
  watchTotal,
  watchShowSizes,
  watchInternalPageSize,
  getInternalPageSize
} from '../src/pager'

export type IPagerProps = ExtractPropTypes<typeof pagerProps>

export interface IPagerState {
  showPager: boolean
  showSizes: boolean
  internalCurrentPage: number
  internalPageSize: number
  lastEmittedPage: number
  userChangePageSize: boolean
  internalTotal: number | undefined
  jumperValue: string
  jumperBackup: string
  internalLayout: string[]
  totalText: string
  internalPageCount: number | null
  showJumperSuffix: boolean
  align: 'left' | 'center' | 'right'
  totalI18n: 'total' | 'totals'
  totalFixedLeft: boolean
  pageSizeText: string
}

export interface IPagerApi {
  state: IPagerState
  t: IPagerRenderlessParamUtils['t']
  computedShowPager: ReturnType<typeof computedShowPager>
  computedInternalLayout: ReturnType<typeof computedInternalLayout>
  computedTotalText: ReturnType<typeof computedTotalText>
  computedInternalPageCount: ReturnType<typeof computedInternalPageCount>
  handleJumperFocus: ReturnType<typeof handleJumperFocus>
  handleSizeChange: ReturnType<typeof handleSizeChange>
  handleJumperInput: ReturnType<typeof handleJumperInput>
  handleJumperChange: ReturnType<typeof handleJumperChange>
  handleJumperClick: ReturnType<typeof handleJumperClick>
  isValueNumber: ReturnType<typeof isValueNumber>
  parseValueNumber: ReturnType<typeof parseValueNumber>
  handleSizeShowPopover: ReturnType<typeof handleSizeShowPopover>
  handleSizeHidePopover: ReturnType<typeof handleSizeHidePopover>
  canJumperGo: ReturnType<typeof canJumperGo>
  beforeSizeChangeHandler: ReturnType<typeof beforeSizeChangeHandler>
  beforePagerChangeHandler: ReturnType<typeof beforePagerChangeHandler>
  copyEmit: ReturnType<typeof copyEmit>
  beforeChangeHandler: ReturnType<typeof beforeChangeHandler>
  handleCurrentChange: ReturnType<typeof handleCurrentChange>
  prev: ReturnType<typeof prev>
  next: ReturnType<typeof next>
  buildBeforePageChangeParam: ReturnType<typeof buildBeforePageChangeParam>
  getValidCurrentPage: ReturnType<typeof getValidCurrentPage>
  emitChange: ReturnType<typeof emitChange>
  setTotal: ReturnType<typeof setTotal>
  clickSizes: ReturnType<typeof clickSizes>
  watchInternalCurrentPage: ReturnType<typeof watchInternalCurrentPage>
  watchCurrentPage: ReturnType<typeof watchCurrentPage>
  watchInternalPageCount: ReturnType<typeof watchInternalPageCount>
  watchTotal: ReturnType<typeof watchTotal>
  watchShowSizes: ReturnType<typeof watchShowSizes>
  watchInternalPageSize: ReturnType<typeof watchInternalPageSize>
  getInternalPageSize: ReturnType<typeof getInternalPageSize>
}
export type IPagerRenderlessParams = ISharedRenderlessFunctionParams<never> & {
  api: IPagerApi
  state: IPagerState
  props: IPagerProps
}

export type IPagerRenderlessParamUtils = ISharedRenderlessParamUtils<never>