import { reactive } from "vue";
import { useNuxtApp } from "./nuxt.mjs";
import { defineNuxtPlugin } from '#app'

export const _getAppConfig = () => defineNuxtPlugin;
function deepDelete(obj, newObj) {
  for (const key in obj) {
    const val = newObj[key];
    if (!(key in newObj)) {
      delete obj[key];
    }
    if (val !== null && typeof val === "object") {
      deepDelete(obj[key], newObj[key]);
    }
  }
}
function deepAssign(obj, newObj) {
  for (const key in newObj) {
    const val = newObj[key];
    if (val !== null && typeof val === "object") {
      deepAssign(obj[key], val);
    } else {
      obj[key] = val;
    }
  }
}
export function useAppConfig() {
  const nuxtApp = useNuxtApp();
  if (!nuxtApp._appConfig) {
    nuxtApp._appConfig = reactive(defineNuxtPlugin);
  }
  return nuxtApp._appConfig;
}
export function updateAppConfig(appConfig) {
  const _appConfig = useAppConfig();
  deepAssign(_appConfig, appConfig);
}
if (process.dev) {
  let applyHMR = function(newConfig) {
    const appConfig = useAppConfig();
    if (newConfig && appConfig) {
      deepAssign(appConfig, newConfig);
      deepDelete(appConfig, newConfig);
    }
  };
  if (import.meta.hot) {
    import.meta.hot.accept((newModule) => {
      const newConfig = newModule._getAppConfig();
      applyHMR(newConfig);
    });
  }
  if (import.meta.webpackHot) {
    import.meta.webpackHot.accept("#build/app.config.mjs", () => {
      applyHMR(defineNuxtPlugin);
    });
  }
}
