import { createSSRApp, computed } from 'vue'
import App from './App'
import uviewPlus, { setConfig } from 'uview-plus'
import store from './store'
import config from '@/config/config'
import airBtn from '@/components/m-airbtn/index.vue'
import mpShare from '@/utils/mpShare.js'
import * as filterUtils from './utils/filters.js'
import { getThemeStyle } from '@/utils/theme'

export function createApp() {
  const app = createSSRApp(App)

  // uview-plus 内部会触发 Vue3 开发态告警（枚举组件实例 keys），不影响运行
  app.config.warnHandler = (msg, _instance, trace) => {
    if (
      typeof msg === 'string' &&
      msg.includes('enumerating keys on a component instance')
    ) {
      return
    }
    try {
      console.warn(`[Vue warn]: ${msg}${trace || ''}`)
    } catch (e) {
      // #ifdef MP-WEIXIN
      // 微信开发者工具部分版本在输出 Vue warn 时会触发
      // TypeError: Cannot read property '__global' of null
      // #endif
    }
  }

  app.use(store)
  app.use(uviewPlus)

  // uview-plus 的图标字体默认每个 u-icon 实例都会触发 uni.loadFontFace，
  // 导致进入页面时同一字体被反复请求。开启 loadFontOnce 后全局只加载一次。
  setConfig({
    config: {
      loadFontOnce: true,
    },
    props: {
      form: {
        labelWidth: '180rpx',
        labelPosition: 'left',
      },
    },
  })

  app.config.globalProperties.$store = store
  app.config.globalProperties.$mainColor = computed(() => store.getters.mainColor)
  app.config.globalProperties.$lightColor = computed(() => store.getters.lightColor)
  app.config.globalProperties.$aiderLightColor = computed(
    () => store.getters.aiderLightColor
  )

  const filterMethods = {}
  Object.keys(filterUtils).forEach((key) => {
    if (typeof filterUtils[key] === 'function') {
      filterMethods[key] = filterUtils[key]
    }
  })

  app.mixin({
    methods: filterMethods,
    computed: {
      themeStyle() {
        return getThemeStyle(this.$store.state.theme)
      },
    },
  })
  app.mixin(mpShare)

  // #ifdef H5
  if (config.enableMiniBarStartUpApp) {
    const mountPoint = document.createElement('div')
    document.body.appendChild(mountPoint)
    createSSRApp(airBtn).mount(mountPoint)
  }
  // #endif

  return {
    app
  }
}
