import BootstrapVue from 'bootstrap-vue'
import { createPinia } from 'pinia'
import { createApp, watchEffect } from 'vue'
import VueToast from 'vue-toast-notification'
import VueLogger from 'vuejs-logger'

import { TranslationPlugin } from './i18n'
import router from './router'
import store from './store'
import App from './App.vue'

import 'vue-toast-notification/dist/theme-default.css'
import '../node_modules/bootstrap-vue/dist/bootstrap-vue.css'
import '../node_modules/bootstrap/scss/bootstrap.scss'
import './assets/custom.scss'
import './assets/styles/tailwind.css'
import { shouldLog } from '@/utilities'
import { useAuthStore, useUserStore } from '@/stores/auth'
import { useHostStore } from '@/stores/hosts'
import { useLicenseStore } from '@/stores/licenses'

const pinia = createPinia()
const app = createApp(App)
app.config.warnHandler = (message, instance, trace) => {
  if (shouldLog(message, instance, trace)) {
    console.warn(`[Vue warn]: ${message}`, trace)
  }
}

app.use(store)
app.use(pinia)
app.use(router)
app.use(VueLogger, {
  isEnabled: true,
  logLevel:
    ['debug', 'info', 'warn', 'error', 'fatal'].indexOf(import.meta.env.VUE_APP_LOGLEVEL) === -1
      ? 'warn'
      : import.meta.env.VUE_APP_LOGLEVEL,
  stringifyArguments: false,
  showLogLevel: true,
  showMethodName: false,
  separator: '|',
  showConsoleColors: true,
})
app.use(BootstrapVue)
app.use(TranslationPlugin)
app.use(VueToast, { position: 'bottom-left' })
store.$log = app.$log
app.mount('#app')

const authStore = useAuthStore()
const hostStore = useHostStore()
const userStore = useUserStore()
const licenseStore = useLicenseStore()

watchEffect(async () => {
  if (authStore.currentUser) {
    try {
      await Promise.all([hostStore.list(), userStore.list(), licenseStore.list()])
    } catch (e) {
      console.error('unable to load base state from stores', e)
    }
  }
})