import type { InjectionKey } from 'vue'
import { inject, provide } from 'vue'

import type { GetComponent, TransformCellText } from '../interface'
import type { FixedInfo } from '../utils/fixUtil'

export interface TableContextProps {
  // Table context
  prefixCls: string

  getComponent: GetComponent

  scrollbarSize: number

  direction: 'ltr' | 'rtl'

  fixedInfoList: readonly FixedInfo[]

  isSticky: boolean

  summaryCollect: (uniKey: string, fixed: boolean | string) => void

  transformCellText: TransformCellText<unknown>
}

export const TableContextKey: InjectionKey<TableContextProps> = Symbol('TableContextProps')

export const useProvideTable = (props: TableContextProps) => {
  provide(TableContextKey, props)
}

export const useInjectTable = () => {
  return inject(TableContextKey, {} as TableContextProps)
}
