/* global Ext, $App, SystemJS */
const {
  replaceExtJSDialogs,
  replaceExtJSMessageBarDialog
} = require('../../utils/replaceExtJSWidgets/replaceExtJSWidgets')

const initReplace = () => {
  replaceExtJSDialogs()
  replaceExtJSMessageBarDialog()
}

SystemJS.set(
  '@unitybase/adminui-vue/initExtReplace',
  SystemJS.newModule({ initReplace })
)
module.exports = async (Vue) => {
  const isExt = typeof window.Ext !== 'undefined'

  /**
   * Magic link to focus DOM/Ext element with specified id
   * @example

    <a href="#" data-cmd-type="setFocus" data-elm-id="my-html-element-id">focus other</a>

   * @param {object} params
   * @param {string} params.elmId
   * @param {EventTarget} target
   */
  function magicLinkFocusCommand (params, target) {
    const extCmp = isExt && $App.viewport.centralPanel.getTabById(params.elmId)
    if (extCmp) {
      // try Ext
      Ext.callback(extCmp.focus, extCmp, [], 100)
    } else {
      // try DOM
      const domElm = document.getElementById(params.elmId)
      if (domElm && domElm.focus) domElm.focus()
    }
  }

  if (window.$App && isExt) {
    initReplace()

    // TODO: (AndreyS) if we get cmdCode on all ubm_navshortcut this is no needed
    // UB.connection.on('ubm_navshortcut:changed', (execParams) => {
    //   if (execParams && execParams.method !== 'delete') {
    //     UB.core.UBStoreManager.updateNavshortcutCacheForItem(
    //       execParams.resultData,
    //       false
    //     )
    //   }
    // })
  }

  // NOTE: (AndreyS) we can rewrite this to System module
  // Relogin.created calls UB.connection.setRequestAuthParamsFunction to define dialog for auth
  const Relogin = require('../../components/relogin/URelogin.vue').default
  /**
   *
   */
  function replaceDefaultRelogin () {
    const ReloginConstructor = Vue.extend(Relogin)
    const instance = new ReloginConstructor()
    const vm = instance.$mount()
    document.body.appendChild(vm.$el)
  }

  // NOTE: (AndreyS) we can rewrite this to System module
  // Request2fa.created calls UB.connection.setRequest2faFunction to define dialog for 2fa
  const Request2fa =
    require('../../components/relogin/URequest2fa.vue').default
  /**
   *
   */
  function replaceDefaultRequest2fa () {
    const Request2faConstructor = Vue.extend(Request2fa)
    const instance = new Request2faConstructor()
    const vm = instance.$mount()
    document.body.appendChild(vm.$el)
  }

  if (window.$App) {
    /**
     * @param {object} params
     */
    function magicLinkAdminUiCommand (params) {
      $App.doCommand(params)
    }

    // INIT MAGIC LINKS
    const magicLink = SystemJS.get('@unitybase/adminui-vue').magicLink
    magicLink.install()
    magicLink.addCommand('setFocus', magicLinkFocusCommand)
    magicLink.addCommand('showForm', magicLinkAdminUiCommand)
    magicLink.addCommand('showList', magicLinkAdminUiCommand)
    magicLink.addCommand('showReport', magicLinkAdminUiCommand)

    replaceDefaultRelogin()
    replaceDefaultRequest2fa()
    const UNavbarDefaultSlot =
      require('../../components/navbarSlotDefault/UNavbarDefaultSlot.vue').default
    /**
     * Additional components can be added to the Sidebar and NavBar using this event
     *
     * @example
     *   window.$App.on('applicationReady', () => {
     *     const SidebarSlotExample = require('./samples/SidebarSlotExample.vue').default
     *     $App.fireEvent('portal:sidebar:defineSlot', SidebarSlotExample, { some attrs })
     *
     *     const NavBarSlotExample = require('./samples/NavbarSlotExample.vue').default
     *     $App.fireEvent('portal:navbar:defineSlot', NavBarSlotExample, { some attrs })
     *   }
     * @event 'portal:navbar:defineSlot'
     * @memberOf module:@unitybase/adminui-vue
     */
    $App.fireEvent('portal:navbar:defineSlot', UNavbarDefaultSlot, {})

    // Need for show loader when load scripts, modules, etc.
    const loaderService = require('../modules/loaderService')
    loaderService.subscribe()
  } else {
    console.log('window.$App is not defined')
    return null
  }
}