import type { AntdTableOptions, AntdTableResult, Data, Params, Service } from "ahooks/lib/useAntdTable/types";
import type { FormInstance } from "antd/es/form";

type FormValues = Record<string, any>;
/**
 * useTable 钩子的选项参数
 */
export interface UseTableOptions<TData extends Data, TParams extends Params> extends Omit<AntdTableOptions<TData, TParams>, "defaultParams" | "form" | "defaultType"> {
  /** 是否使用分页，默认是 */
  usePagination?: boolean;
  /** 默认分页参数，默认 { current: 1; pageSize: 10 } */
  defaultPagination?: { current: number; pageSize: number };
  /** 是否使用存储查询条件，默认是 */
  useStorageQueryCriteria?: boolean;
  /** 是否使用数据权限，默认是 */
  usePermission?: boolean;
  /** 额外参数 */
  params?: Record<string, any> | (() => Record<string, any>);
  /** 表单数据转换函数，在每次请求之前调用，接收当前搜索的表单项，要求返回一个对象 */
  transform?: (formData: FormValues) => FormValues;
  /** @deprecated 已弃用，请使用 onSuccess */
  callback?: (list: any[], data: any) => void;
  /** 表单实例（通过 Form.useForm() 创建） */
  form?: FormInstance;
}

/**
 * 基础分页配置接口
 */
export interface BasePaginationConfig {
  /** 当前页码 */
  current: number;
  /** 每页数量 */
  pageSize: number;
  /** 总数 */
  total: number;
}

/**
 * 扩展分页配置接口
 */
export interface ExtendedPaginationConfig extends BasePaginationConfig {
  /** 显示快速跳转 */
  showQuickJumper: boolean;
  /** 显示页码选择器 */
  showSizeChanger: boolean;
}

/**
 * useTable 钩子返回的结果
 */
export interface UseTableResult<TData extends Data, TParams extends Params> extends AntdTableResult<TData, TParams> {
  /** 表格属性 */
  tableProps: {
    /** 表格数据 */
    dataSource: TData["list"];
    /** 表格加载状态 */
    loading: boolean;
    /** 表格改变 */
    onChange: (pagination: any, filters?: any, sorter?: any) => void;
    /** 分页属性 */
    pagination: false | ExtendedPaginationConfig;
    [key: string]: any;
  };
  /** 查询方法，等于直接调用 search.submit */
  getData: () => void;
}

/**
 * 自定义 useTable，继承 ahooks 的 useAntdTable，根据需求进行扩展
 */
declare function useTable<TData extends Data, TParams extends Params>(
  service: Service<TData, TParams>,
  options?: UseTableOptions<TData, TParams>,
): UseTableResult<TData, TParams>;

export default useTable;
