/* eslint-disable vue/no-reserved-component-names */
import { createApp, watchEffect } from 'vue'

import { registerAccessDirective } from '@vben/access'
import { registerLoadingDirective } from '@vben/common-ui'
import { preferences } from '@vben/preferences'
import { initStores } from '@vben/stores'
import '@vben/styles'
import '@vben/styles/antd'

import * as elIcons from '@element-plus/icons-vue'
import { useTitle } from '@vueuse/core'
import { Boot } from '@wangeditor/editor'
import formulaModule from '@wangeditor/plugin-formula'
import VxeUI from 'vxe-pc-ui'
import VxeUITable from 'vxe-table'

import Switch from '#/components/Switch'
import { $t, setupI18n } from '#/locales'
import { router } from '#/router'

import { initComponentAdapter } from './adapter/component'
import { initSetupVbenForm } from './adapter/form'
import App from './app.vue'
import directives from './directive'

import '#/components/mj/mj-table-select/renderer.tsx'
import '#/components/mj/mj-form-text/renderer.tsx'
import '#/components/mj/mj-form-input/renderer.tsx'
import '#/components/mj/mj-form-money/renderer.tsx'
import '#/components/mj/mj-form-phone/renderer.tsx'
import '#/components/mj/mj-form-image/renderer.tsx'
import '#/components/mj/mj-form-upload/renderer.tsx'
import '#/components/mj/mj-form-target/renderer.tsx'

import '#/styles/global.scss'
import 'vxe-pc-ui/lib/style.css'
import 'vxe-table/lib/style.css'

async function bootstrap(namespace: string) {
  // 初始化组件适配器
  await initComponentAdapter()

  // 初始化表单组件
  await initSetupVbenForm()

  // 设置弹窗的默认配置
  // setDefaultModalProps({
  //   fullscreenButton: false,
  // });
  // 设置抽屉的默认配置
  // setDefaultDrawerProps({
  //   zIndex: 1020,
  // });

  const app = createApp(App)

  // 注册v-loading指令
  registerLoadingDirective(app, {
    loading: 'loading', // 在这里可以自定义指令名称，也可以明确提供false表示不注册这个指令
    spinning: 'spinning',
  })

  // 国际化 i18n 配置
  await setupI18n(app)

  // 配置 pinia-tore
  await initStores(app, { namespace })

  // 安装权限指令
  registerAccessDirective(app)

  // 初始化 tippy
  const { initTippy } = await import('@vben/common-ui/es/tippy')
  initTippy(app)

  // 配置路由及路由守卫
  app.use(router)

  // 配置@tanstack/vue-query
  const { VueQueryPlugin } = await import('@tanstack/vue-query')
  app.use(VueQueryPlugin)

  // 配置Motion插件
  const { MotionPlugin } = await import('@vben/plugins/motion')
  app.use(MotionPlugin)
  // 注册所有el+的icon
  const icons = elIcons as any
  for (const i in icons) {
    app.component(`el-icon-${icons[i].name}`, icons[i])
  }

  app.component(`Switch`, Switch)
  app.use(VxeUI)
  app.use(VxeUITable)
  // 自定义指令
  directives.install(app)

  // 动态更新标题
  watchEffect(() => {
    if (preferences.app.dynamicTitle) {
      const routeTitle = router.currentRoute.value.meta?.title
      const pageTitle =
        (routeTitle ? `${$t(routeTitle)} - ` : '') + preferences.app.name
      useTitle(pageTitle)
    }
  })

  // 注册。要在创建编辑器之前注册，且只能注册一次，不可重复注册。
  Boot.registerModule(formulaModule)

  app.mount('#app')
}

export { bootstrap }
