/*
 * Main entrypoint of AlekSIS0-Core.
 *
 * This script sets up all necessary Vue plugins and defines the Vue app.
 */

import Vue from "vue";
import Vuetify from "@/vuetify";
import VueI18n from "@/vue-i18n";
import VueRouter from "@/vue-router";
import VueApollo from "@/vue-apollo";

import AleksisVue from "./plugins/aleksis.js";

console.info("🎒 Welcome to AlekSIS®, the Free School Information System!");
console.info("AlekSIS® is Free Software, licenced under the EUPL, version 1.2 or later, by Teckids e.V. (Bonn, Germany)");

// Install the AleksisVue plugin first and let it do early setup
Vue.use(AleksisVue);
Vue.$configureSentry();
Vue.$registerGlobalComponents();

// Third-party plugins
Vue.use(Vuetify);
Vue.use(VueI18n);
Vue.use(VueRouter);
Vue.use(VueApollo);

// All of these imports yield config objects to be passed to the plugin constructors
import vuetifyOpts from "./app/vuetify.js";
import i18nOpts from "./app/i18n.js";
import routerOpts from "./app/router.js";
import apolloOpts from "./app/apollo.js";

const i18n = new VueI18n(i18nOpts);
const vuetify = new Vuetify(vuetifyOpts);
const router = new VueRouter(routerOpts);
const apolloProvider = new VueApollo(apolloOpts);

// Parent component rendering the UI and all features outside the specific pages
import App from "./components/app/App.vue";

const app = new Vue({
  el: "#app",
  apolloProvider,
  vuetify: vuetify,
  render: (h) => h(App),
  data: () => ({
    showCacheAlert: false,
    contentLoading: false,
    offline: false,
    backgroundActive: true,
  }),
  router,
  i18n,
});

// Late setup for some plugins handed off to out ALeksisVue plugin
app.$loadAppMessages();
app.$setupNavigationGuards();