import '@ibiz-template/theme/style/index.scss';
import Vue from 'vue';
import Router from 'vue-router';
import { PiniaVuePlugin } from 'pinia';
import { textFormat } from 'vue-text-format';
import router from './router';
import App from './App';
import { AppRegister } from './app-register';
import UserRegister from './user-register';
import {
  MessageUtil,
  OpenViewUtil,
  ModalUtil,
  NotificationUtil,
  LoadingUtil,
  ErrorHandler,
  OverlayController,
} from './util';
import { piniaInstance } from './store';
import { attachEnvironmentConfig } from './attach-environment-config';
import { PluginFactory } from './plugin';
import { installDefaultPluginRegister } from './default-plugin-register';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(Router);
Vue.use(PiniaVuePlugin);
Vue.use(AppRegister);

/** 异常处理:start */
Vue.config.errorHandler = function (err: Error, _vm) {
  ErrorHandler.handlerError(err);
};

window.onerror = function (
  event: Event | string,
  source?: string,
  lineno?: number,
  colno?: number,
  error?: Error,
) {
  if (error) {
    ErrorHandler.handlerError(error);
  }
};

window.addEventListener('unhandledrejection', function (event) {
  // 阻止继续冒泡
  event.preventDefault();
  // 获取到未处理的promise对象
  event.promise.catch(err => {
    ErrorHandler.handlerError(err);
  });
});
/** 异常处理:end */

async function createApp(): Promise<void> {
  await attachEnvironmentConfig();

  const app = new Vue({
    created() {
      ibiz.openView = new OpenViewUtil();
      ibiz.message = new MessageUtil();
      ibiz.modal = new ModalUtil();
      ibiz.notification = new NotificationUtil();
      ibiz.loading = new LoadingUtil();
      ibiz.overlay = new OverlayController();
      ibiz.plugin = new PluginFactory();
      ibiz.util.text.format = textFormat;
      installDefaultPluginRegister();
      Vue.use(UserRegister);
    },
    router,
    pinia: piniaInstance,
    render: h => h(App),
  });

  app.$mount('#app');
}

createApp();