import { Detail } from "./interface";
import { reactive, computed, toRefs } from "vue";
import { useUserStore } from "@/stores/modules/user";

/**
 * @description base 基础信息页面操作方法封装
 * @param {Function} api 获取表格数据 api 方法 (必传)
 * @param {Object} initParam 获取数据初始化参数 (非必传，默认为{})
 * @param {Function} dataCallBack 对后台返回的数据进行处理的方法 (非必传)
 * @param {Function} requestError 错误处理
 * */
export const useBaseMsg = (
  api?: (params: any) => Promise<any>,
  initParam: object = {},
  dataCallBack?: (data: any) => any,
  requestError?: (error: any) => void
) => {
  const state = reactive<Detail.DetailStateProps>({
    baseData: {},
    // 查询参数(只包括查询)
    searchParam: {},
    // 初始化默认的查询参数
    searchInitParam: {},
    // 总参数(包含分页和查询参数)
    totalParam: {}
  });

  /**
   * @description 获取详情页,基础信息模块
   * @return void
   * */
  const getBamseMsg = async () => {
    if (!api) {
      state.searchParam = initParam;
      return;
    }
    try {
      // 先把初始化参数和分页参数放到总参数里面
      console.log("state.totalParam :>> ", state.totalParam);
      console.log("state.initParam :>> ", initParam);
      console.log("state.searchParam :>> ", state.searchParam);
      Object.assign(state.totalParam, initParam);
      console.log("state.totalParam :>> ", state.totalParam);
      let data = await api({ ...state.searchInitParam, ...state.totalParam });
      dataCallBack && (data = dataCallBack(data));
      state.baseData = data;
      console.log("getTableList data :>> ", data);
      // state.tableData = data[reqProp];
      // 解构后台返回的分页数据 (如果有分页更新分页信息)
      // const { pageNum, pageSize, total } = data;
      // isPageable && updatePageable({ pageNum, pageSize, total });
    } catch (error) {
      requestError && requestError(error);
    }
  };

  // /**
  //  * @description 获取表格数据
  //  * @return void
  //  * */
  // const getTableList = async () => {
  //   if (!apiBase) return;
  //   try {
  //     // 先把初始化参数和分页参数放到总参数里面
  //     console.log("state.totalParam :>> ", state.totalParam);
  //     console.log("state.initParam :>> ", initParam);
  //     console.log("state.searchParam :>> ", state.searchParam);
  //     Object.assign(state.totalParam, isPageable ? pageParam.value : {});
  //     console.log("state.totalParam :>> ", state.totalParam);
  //     let data = await apiBase({ ...state.searchInitParam, ...state.totalParam });
  //     dataCallBack && (data = dataCallBack(data));
  //     state.tableData = isPageable ? data.list : data;
  //     console.log("getTableList data :>> ", data);
  //     // state.tableData = data[reqProp];
  //     // 解构后台返回的分页数据 (如果有分页更新分页信息)
  //     const { pageNum, pageSize, total } = data;
  //     isPageable && updatePageable({ pageNum, pageSize, total });
  //   } catch (error) {
  //     requestError && requestError(error);
  //   }
  // };

  /**
   * @description 更新查询参数
   * @return void
   * */
  const updatedTotalParam = () => {
    state.totalParam = {};
    // 处理查询参数，可以给查询参数加自定义前缀操作
    let nowSearchParam: { [key: string]: any } = {};
    // 防止手动清空输入框携带参数（这里可以自定义查询参数前缀）
    for (let key in state.searchParam) {
      // * 某些情况下参数为 false/0 也应该携带参数
      if (state.searchParam[key] || state.searchParam[key] === false || state.searchParam[key] === 0) {
        nowSearchParam[key] = state.searchParam[key];
      }
    }
    Object.assign(state.totalParam, nowSearchParam);
    console.log("updatedTotalParam state.searchParam :>> ", state.searchParam);
    console.log("updatedTotalParam state.totalParam :>> ", state.totalParam);

    // if (dwname) {
    //   const userStore = useUserStore();
    //   userStore.setSearchQueryHabit(dwname, state.totalParam);
    // }
  };

  // /**
  //  * @description 更新分页信息
  //  * @param {Object} resPageable 后台返回的分页数据
  //  * @return void
  //  * */
  // const updatePageable = (resPageable: Table.Pageable) => {
  //   Object.assign(state.pageable, resPageable);
  // };

  // /**
  //  * @description 表格数据查询
  //  * @return void
  //  * */
  // const search = () => {
  //   state.pageable.pageNum = 1;
  //   updatedTotalParam();
  //   getTableList();
  // };

  // /**
  //  * @description 表格数据重置
  //  * @return void
  //  * */
  // const reset = () => {
  //   state.pageable.pageNum = 1;
  //   state.searchParam = {};
  //   // 重置搜索表单的时，如果有默认搜索参数，则重置默认的搜索参数
  //   Object.keys(state.searchInitParam).forEach(key => {
  //     state.searchParam[key] = state.searchInitParam[key];
  //   });
  //   updatedTotalParam();
  //   getTableList();
  // };

  // /**
  //  * @description 每页条数改变
  //  * @param {Number} val 当前条数
  //  * @return void
  //  * */
  // const handleSizeChange = (val: number) => {
  //   state.pageable.pageNum = 1;
  //   state.pageable.pageSize = val;
  //   getTableList();
  // };

  // /**
  //  * @description 当前页改变
  //  * @param {Number} val 当前页
  //  * @return void
  //  * */
  // const handleCurrentChange = (val: number) => {
  //   state.pageable.pageNum = val;
  //   getTableList();
  // };

  return {
    ...toRefs(state),
    getBamseMsg,
    // search,
    // reset,
    // handleSizeChange,
    // handleCurrentChange,
    updatedTotalParam
  };
};
