export default {
  get(enumKey, enumValue) {
    enumKey = enumKey.toLowerCase();
    if (enumKey != "authorizationroles") {
      if (window.$gz.store.state.enums[enumKey] == undefined) {
        throw new Error(
          "ERROR enums::get -> enumKey " + enumKey + " is missing from store"
        );
      }

      const ret = window.$gz.store.state.enums[enumKey][enumValue];
      if (ret == undefined) {
        return "";
      } else {
        return ret;
      }
    } else {
      const ret = [];
      if (enumValue == null || enumValue == 0) {
        return "";
      }
      const availableRoles = this.getSelectionList("AuthorizationRoles");
      for (let i = 0; i < availableRoles.length; i++) {
        const role = availableRoles[i];
        if (enumValue & role.id) {
          ret.push(role.name);
        }
      }
      return ret.join(", ");
    }
  },
  //////////////////////////////////
  //
  // Used by forms to fetch selection list data
  // Sorts alphabetically by default but can be turned off with do not sort
  //
  getSelectionList(enumKey, noSort) {
    enumKey = enumKey.toLowerCase();
    const e = window.$gz.store.state.enums[enumKey];
    if (!e) {
      throw new Error(
        "ERROR enums::getSelectionList -> enumKey " +
          enumKey +
          " is missing from store"
      );
    }
    const ret = [];

    //turn it into an array suitable for selection lists
    for (const [key, value] of Object.entries(e)) {
      ret.push({ id: Number(key), name: value });
    }
    //sort by name
    if (!noSort) {
      ret.sort(window.$gz.util.sortByKey("name"));
    }
    return ret;
  },
  ///////////////////////////////////
  //
  // Fetches enum list from server
  // and puts in store. if necessary
  // ACCEPTS an ARRAY or a single STRING KEY
  //
  async fetchEnumList(enumKey) {
    if (!Array.isArray(enumKey)) {
      enumKey = [enumKey];
    }
    for (let i = 0; i < enumKey.length; i++) {
      //check if list
      //if not then fetch it and store it
      const k = enumKey[i].toLowerCase();

      //de-lodash
      //   if (!window.$gz. _.has(window.$gz.store.state.enums, k)) {
      //enums is an object this is checking if that object has a key with the name in k
      if (!window.$gz.util.has(window.$gz.store.state.enums, k)) {
        const that = this;

        const dat = await that.fetchEnumKey(k);
        //massage the data as necessary
        const e = { enumKey: k, items: {} };
        for (let i = 0; i < dat.length; i++) {
          const o = dat[i];
          e.items[o.id] = o.name;
        }
        //stuff the data into the store
        window.$gz.store.commit("setEnum", e);
      }
    }
  },
  async fetchEnumKey(enumKey) {
    const res = await window.$gz.api.get("enum-list/list/" + enumKey);
    //We never expect there to be no data here
    //if (!Object.prototype.hasOwnProperty.call(res, "data")) {
    if (!Object.prototype.hasOwnProperty.call(res, "data")) {
      return Promise.reject(res);
    }
    return res.data;
  }
};
