import "./public-path";
import { createApp } from "vue";
import { createRouter, createMemoryHistory } from "vue-router";
import App from "./App.vue";
import routes from "./router";
import store from "./store";
import packageJson from "../package.json";
import "@/assets/style/reset.css";
import "@/assets/style/my-reset.css";

const packageName = packageJson.name;
const rootId = packageName + "__id";

let instance = null;
let router = null;
let history = null;

function render(props = {}) {
  const { container } = props;

  history = createMemoryHistory(
    window.__POWERED_BY_QIANKUN__ ? `/${packageName}` : "/"
  );

  router = createRouter({
    history,
    routes,
  });

  instance = createApp(App);
  instance.use(router);
  instance.use(store);
  instance.mount(
    container
      ? container.querySelector(`#${rootId}`)
      : document.getElementById(rootId)
  );
}

if (!window.__POWERED_BY_QIANKUN__) {
  render();
}

/**
 * bootstrap 只会在微应用初始化的时候调用一次，下次微应用重新进入时会直接调用 mount 钩子，不会再重复触发 bootstrap。
 * 通常我们可以在这里做一些全局变量的初始化，比如不会在 unmount 阶段被销毁的应用级别的缓存等。
 */
export async function bootstrap(props) {
  console.log(`[${packageName}] app bootstraped`, props);
}

/**
 * 应用每次进入都会调用 mount 方法，通常我们在这里触发应用的渲染方法
 */
export async function mount(props) {
  console.log(`[${packageName}] app mount`, props);

  // templateCode: 子应用的唯一标识，格式: `PoiID_${poiId}_TemplateCode_${templateCode}`
  // appName: 子应用的名称
  // entry: 子应用的地址，带版本号，可以当成 baseUrl 使用
  // App3DNode: 子应用使用的节点，所有加载3d资源都要放入该节点下
  // AppCameraNode: 主应用分配的camera节点，在主摄像机下的空节点
  // SenseNode: 主应用分配的UI节点
  // PoiConfig: 子应用 POI 配置信息
  // SubAppInfo: 子应用的配置，只有基本信息。通用配置、子应用配置、运营配置和奖品配置都需要额外获取
  // customProps: 自定义传参
  // const {
  //   appName,
  //   templateCode,
  //   entry,
  //   App3DNode,
  //   AppCameraNode,
  //   SenseNode,
  //   PoiConfig,
  //   SubAppInfo,
  //   customProps,
  // } = props;

  render(props);
}

/**
 * 应用每次 切出/卸载 会调用的方法，通常在这里我们会卸载微应用的应用实例
 */
export async function unmount() {
  console.log(`[${packageName}] app unmount`);
  instance.unmount();
  instance._container.innerHTML = "";
  instance = null;
  router = null;
  history.destroy();
}

/**
 * 可选生命周期钩子，仅使用 loadMicroApp 方式加载微应用时生效
 * 该生命周期钩子，目前仅仅用于设置子应用的 激活/未激活 状态
 */
export async function update(customProps) {
  // 假如没有相关需求，该生命周期可以删除
  console.log(`[${packageName}] app update`, customProps);
}
