export interface IFunction<T = any> {
  (x?: any): T;
}

export interface IObject<T = any> {
  [key: string]: T;
}

export interface IHttpResponse {
  code: number;
  msg: string;
  data: any;
}

/**
 * 菜单
 */
export interface IServerMenus {
  createDate: string;
  icon: string | boolean;
  id: string;
  name: string;
  parentName: string;
  permissions: string;
  pid: string;
  sort: number;
  type: number;
  url: string;
  openStyle: number;
  redirect?: string;
  children?: IServerMenus[];
}

export interface ICacheOptions {
  /**
   * 是否取值后立即删除缓存
   */
  isDelete?: boolean;
  /**
   * 是否采用JSON格式化缓存值
   */
  isParse?: boolean;
  /**
   * 是否采用会话缓存介质
   */
  isSessionStorage?: boolean;
}

export interface IViewHooksOptions {
  //  设置属性
  /**
   * 此页面是否在创建时，调用查询数据列表接口？
   */
  createdIsNeed?: boolean;
  /**
   * 此页面是否在激活（进入）时，调用查询数据列表接口？
   */
  activatedIsNeed?: boolean;
  /**
   * 数据列表接口，API地址
   */
  getDataListURL?: string;
  /**
   * 数据列表接口，是否需要分页？
   */
  getDataListIsPage?: boolean;
  /**
   * 删除接口，API地址
   */
  deleteURL?: "";
  /**
   * 删除接口，是否需要批量？
   */
  deleteIsBatch?: boolean;
  /**
   * 删除接口，批量状态下由那个key进行标记操作？比如：pid，uid...
   */
  deleteIsBatchKey?: string;
  /**
   * 导出接口，API地址
   */
  exportURL?: string;

  /**
   * 查询条件
   */
  dataForm?: IObject;
  /**
   * 数据列表
   */
  dataList?: IObject[];
  /**
   * 排序，asc／desc
   */
  order?: string;
  /**
   * 排序，字段
   */
  orderField?: string;
  /**
   * 当前页码
   */
  page?: number;
  /**
   * 每页数
   */
  limit?: number;
  /**
   * 总条数
   */
  total?: number;
  /**
   * 数据列表，loading状态
   */
  dataListLoading?: boolean;
  /**
   * 数据列表，多选项
   */
  dataListSelections?: IObject[];
  elTable?: IObject;
}

export interface IViewHooks extends IViewHooksOptions, IObject {
  /**
   * 检查权限
   */
  hasPermission: (key: string) => boolean;
  /**
   * 获取字典名称
   */
  getDictLabel: (dictType: string, dictValue: number) => string | number;
  /**
   * 查询列表记录
   */
  query: () => void;
  /**
   * 列表多选事件
   */
  dataListSelectionChangeHandle: (list: IObject[]) => void;
  /**
   * 列表排序事件
   */
  dataListSortChangeHandle: (sort: IObject) => void;
  /**
   * 列表切换每页显示数量事件
   */
  pageSizeChangeHandle: (pageSize: number) => void;
  /**
   * 列表分页事件
   */
  pageCurrentChangeHandle: (pageIndex: number) => void;
  /**
   * 列表搜索事件
   */
  getDataList: () => void;
  /**
   * 列表删除事件
   */
  deleteHandle: (id?: string) => Promise<any>;
  /**
   * 列表导出事件
   */
  exportHandle: () => void;
  /**
   * 关闭当前tab页
   */
  closeCurrentTab: () => void;
}
