import type { Component, Ref, ComputedRef, ExtractPropTypes } from 'vue'
import type { VxeColumnProps } from 'vxe-table/types/column'
import type { JVxeComponent } from './JVxeComponent'
import type { VxeGridInstance, VxeTablePropTypes } from 'vxe-table'
import { JVxeTypes } from './JVxeTypes'
import { vxeProps } from '../vxe.data'
import { useMethods } from '../hooks/useMethods'
import { getJVxeAuths } from '../utils/authUtils'

export type JVxeTableProps = Partial<ExtractPropTypes<ReturnType<typeof vxeProps>>>;
export type JVxeTableMethods = ReturnType<typeof useMethods>['methods']

export type JVxeVueComponent = {
  enhanced?: JVxeComponent.EnhancedPartial
} & Component

type statisticsTypes = 'sum' | 'average'

export type JVxeColumn = IJVxeColumn & Recordable

/**
 * JVxe 列配置项
 */
export interface IJVxeColumn extends VxeColumnProps {
  type?: any,
  // 行唯一标识
  key: string,
  // 表单预期值的提示信息，可以使用${...}变量替换文本
  placeholder?: string,
  // 默认值
  defaultValue?: any,
  // 是否禁用当前列，默认false
  disabled?: boolean,
  // 校验规则 TODO 类型待定义
  validateRules?: any,
  // 联动下一级的字段key
  linkageKey?: string,
  // 自定义传入组件的其他属性
  props?: Recordable,
  allowClear?: boolean,// 允许清除
  // 【inputNumber】是否是统计列，只有 inputNumber 才能设置统计列。统计列：sum 求和；average 平均值
  statistics?: boolean | [statisticsTypes, statisticsTypes?],
  // 【select】
  dictCode?: string,  // 字典 code
  options?: ({ title?: string, label?: string, text?: string, value: any, disabled?: boolean })[],  // 下拉选项列表
  allowInput?: boolean,  // 允许输入
  allowSearch?: boolean,  // 允许搜索
  // 【slot】
  slotName?: string,// 插槽名
  // 【checkbox】
  customValue?: [any, any],  // 自定义值
  defaultChecked?: boolean,  // 默认选中
  // 【upload】 upload
  btnText?: string, // 上传按钮文字
  token?: boolean, // 是否传递 token
  responseName?: string, // 返回取值名称
  action?: string, // 上传地址
  allowRemove?: boolean, // 是否允许删除
  allowDownload?: boolean, // 是否允许下载
  // 【下拉字典搜索】
  dict?: string,// 字典表配置信息：数据库表名,显示字段名,存储字段名
  async?: boolean, // 是否同步模式
  tipsContent?: string,
  // 【popup】
  popupCode?: string,
  field?: string,
  orgFields?: string,
  destFields?: string,
}

export interface JVxeRefs {
  gridRef: Ref<VxeGridInstance | undefined>
  subPopoverRef: Ref<any>
  detailsModalRef: Ref<any>
}

export interface JVxeDataProps {
  prefixCls: string,
  // vxe 实例ID
  caseId: string,
  // vxe 最终 columns
  vxeColumns?: ComputedRef,
  // vxe 最终 dataSource
  vxeDataSource: Ref<Recordable[]>,
  // 记录滚动条位置
  scroll: { top: number, left: number },
  // 当前是否正在滚动
  scrolling: Ref<boolean>,
  // vxe 默认配置
  defaultVxeProps: object,
  // 绑定左侧选择框
  selectedRows: Ref<any[]>,
  // 绑定左侧选择框已选择的id
  selectedRowIds: Ref<string[]>,
  disabledRowIds: string[],
  // 统计列配置
  statistics: {
    has: boolean,
    sum: string[],
    average: string[],
  },
  // 所有和当前表格相关的授权信息
  authsMap: Ref<Nullable<ReturnType<typeof getJVxeAuths>>>,
  // 内置 EditRules
  innerEditRules: Recordable<VxeTablePropTypes.EditRules[]>,
  // 联动下拉选项（用于隔离不同的下拉选项）
  // 内部联动配置，map
  innerLinkageConfig: Map<string, any>,
  // 开启了数据刷新效果的行
  reloadEffectRowKeysMap: Recordable,
}

export interface JVxeLinkageConfig {
  // 联动第一级的 key
  key: string,
  // 获取数据的方法
  requestData: (parent: string) => Promise<any>,
}

export { JVxeTypes }