/home/ivoiecob/email.hirewise-va.com/modules/AdminPanelWebclient/vue/src/core.js
import { i18n } from 'boot/i18n'

import _ from 'lodash'

import store from 'src/store'
import enums from 'src/enums'

import errors from 'src/utils/errors'
import notification from 'src/utils/notification'
import typesUtils from 'src/utils/types'
import webApi from 'src/utils/web-api'

import modulesManager from 'src/modules-manager'

const core = {
  appData: null,

  parseTenantsFromAppData() {
    const adminPanelWebclientData = typesUtils.pObject(this.appData?.AdminPanelWebclient)
    const tenantsData = typesUtils.pArray(adminPanelWebclientData?.Tenants?.Items)
    if (tenantsData.length > 0) {
      store.dispatch('tenants/parseTenants', tenantsData)
    } else {
      store.dispatch('tenants/requestTenants')
    }
  },

  setAppData(appData) {
    return new Promise((resolve, reject) => {
      this.appData = appData
      enums.init(appData)
      errors.init(appData)
      modulesManager.getModules(appData).then(() => {
        store.dispatch('user/parseAppData', appData).then(() => {
          modulesManager.initModules(appData)
          resolve()
        }, reject)
      }, reject)
    })
  },

  resetAppData() {
    this.appData = null
    store.dispatch('user/resetAppData')
  },

  requestAppData() {
    return new Promise((resolve, reject) => {
      webApi
        .sendRequest({
          moduleName: 'Core',
          methodName: 'GetAppData',
          parameters: {},
        })
        .then(
          (result) => {
            if (_.isObject(result)) {
              this.setAppData(result).then(() => {
                if (store.getters['user/isUserSuperAdminOrTenantAdmin']) {
                  this.parseTenantsFromAppData()
                }
                resolve()
              }, reject)
            } else {
              notification.showError(i18n.global.tc('COREWEBCLIENT.ERROR_UNKNOWN'))
              reject(i18n.global.tc('COREWEBCLIENT.ERROR_UNKNOWN'))
            }
          },
          (response) => {
            notification.showError(errors.getTextFromResponse(response, i18n.global.tc('COREWEBCLIENT.ERROR_UNKNOWN')))
            reject(errors.getTextFromResponse(response, i18n.global.tc('COREWEBCLIENT.ERROR_UNKNOWN')))
          }
        )
    })
  },
}

export default {
  init() {
    return new Promise((resolve, reject) => {
      if (core.appData === null) {
        core.requestAppData().then(resolve, reject)
      } else {
        resolve()
      }
    })
  },

  logout(afterLogoutCallback = () => {}) {
    webApi
      .sendRequest({
        moduleName: 'Core',
        methodName: 'Logout',
        parameters: {},
      })
      .then(
        () => {
          core.resetAppData()
          afterLogoutCallback()
        },
        () => {
          core.resetAppData()
          afterLogoutCallback()
        }
      )
  },

  requestAppData: core.requestAppData.bind(core),
  resetAppData: core.resetAppData.bind(core),

  getAppData() {
    return core.appData
  },
}