import { Storage } from "../utils";
import BasicService from "./BasicService";
import config from "@/config";
import _ from "lodash";

//TODO 参数获取接口（idm）替换为对应的微服务

/**
 * @desc 系统维护
 */
class SettingService extends BasicService {
  SYSTEM_PARAMETER_KEY = `${config.get("/app/code")}_SYSTEM_PARAMETER__`;

  constructor() {
    super();
  }

  /**
   * 根据Code获取公共参数值
   * @param code
   */
  getSystemParam = (code: string) => {
    if (_.isEmpty(code)) {
      return null;
    }
    const systemParameters = this.getSystemParamCache();

    if (_.isEmpty(systemParameters)) {
      return null;
    }

    if (_.has(systemParameters, code)) {
      return _.get(systemParameters, code, null);
    }

    const systemParameter = _.find(
      systemParameters,
      (param: any) => param.code === code
    );
    if (_.isEmpty(systemParameter)) {
      return null;
    }

    return _.get(systemParameter, "content", null);
  };

  /**
   * 初始化公共系统参数
   */
  getSystemParamCache = () => {
    let systemParameters = Storage.local.get(this.SYSTEM_PARAMETER_KEY);
    if (_.isEmpty(systemParameters)) {
      this.reloadSystemParam();
    }
    systemParameters = Storage.local.get(this.SYSTEM_PARAMETER_KEY);
    return systemParameters;
  };

  /**
   * 初始化公共系统参数
   */
  initSystemParam = () => {
    this.reloadSystemParam();
  };

  /**
   * 重新加载公共系统参数
   */
  reloadSystemParam = () => {
    this.getPublicSystemParams().then(({ success, data }) => {
      if (success && !_.isEmpty(data)) {
        const config = _.reduce(
          data,
          (ret: any, config: any) => {
            _.set(ret, config.code, config.content);
            return ret;
          },
          {}
        );
        Storage.local.set(this.SYSTEM_PARAMETER_KEY, config);
      }
    });
  };

  /**
   * 刷新参数缓存
   */
  refreshSystemParams = async () => {
    return await this.post(`/gateway/idm/api/system-parameter/refresh`);
  };

  /**
   * 获取公共参数
   * ENV 前端环境 配置在config目录下对应的define中
   */
  getPublicSystemParams = async () => {
    return await this.get(
      //@ts-ignore
      `/gateway/idm/api/system-parameter/public?env=${ENV}`
    );
  };

  /**
   * 获取参数列表 - 参数管理使用
   */
  querySystemParams = async () => {
    return await this.get(`/gateway/idm/api/system-parameter/all`);
  };

  /**
   * 创建参数 - 参数管理使用
   */
  createSystemParam = async (data: any) => {
    return await this.post(`/gateway/idm/api/system-parameter`, data);
  };

  /**
   * 更新参数 - 参数管理使用
   */
  updateSystemParam = async (data: any) => {
    return await this.put(`/gateway/idm/api/system-parameter`, data);
  };

  /**
   * 批量创建参数 - 参数管理使用
   */
  batchCreateSystemParam = async (data: any) => {
    return await this.post(`/gateway/idm/api/system-parameter/batch`, data);
  };

  /**
   * 批量更新参数 - 参数管理使用
   */
  batchUpdateSystemParam = async (data: any) => {
    return await this.put(`/gateway/idm/api/system-parameter/batch`, data);
  };

  /**
   * 删除参数 - 参数管理使用
   */
  deleteSystemParam = async (id: any) => {
    return await this.delete(`/gateway/idm/api/system-parameter/${id}`, {});
  };
}

const settingService = new SettingService();

export default settingService;
