//Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
//Copyright (C) 2024 HTWKalender support@htwkalender.de

//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU Affero General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU Affero General Public License for more details.

//You should have received a copy of the GNU Affero General Public License
//along with this program.  If not, see <https://www.gnu.org/licenses/>.

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { fileURLToPath } from "node:url";
import resolve from "@rollup/plugin-node-resolve";
import { resolve as pathResolver } from "path";
import terser from "@rollup/plugin-terser";
import generateSitemap from "vite-ssg-sitemap";
import vueDevTools from "vite-plugin-vue-devtools";
import { ViteSSGOptions } from "vite-ssg";
import fs from "fs";

const hostname = "https://cal.htwk-leipzig.de";

// fallback
let commitHash = "unknown"
if (fs.existsSync('.env.commit')) {
  const env = fs.readFileSync('.env.commit', 'utf-8')
  const match = env.match(/COMMIT_HASH=(.+)/)
  if (match) commitHash = match[1]
}

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(), resolve(), terser(), vueDevTools()],
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
      primevue: pathResolver(__dirname, "node_modules/primevue"),
    },
    extensions: [
      ".mjs",
      ".js",
      ".ts",
      ".jsx",
      ".tsx",
      ".json",
      ".css",
      ".scss",
    ],
  },
  define: {
    __COMMIT_HASH__: JSON.stringify(commitHash),
  },
  ssgOptions: <ViteSSGOptions>{
    script: "async",
    formatting: "minify",
    format: "esm",
    onFinished: () => {
      generateSitemap({
        hostname: hostname,
        exclude: [
          "/additional-modules",
          "/edit-additional-modules",
          "/edit-calendar",
          "/rename-modules",
        ],
      });
    },
  },
  server: {
    host: true,
    port: 8000,
    watch: {
      usePolling: true,
    },
    proxy: {
      "/api": {
        target: "http://localhost:8090/api",
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ""),
      },
    },
  },
  build: {
    sourcemap: true,
    minify: "terser",
    terserOptions: {
      compress: {
        drop_console: true,
      },
    },
    cssMinify: "esbuild",
    cssCodeSplit: true,
    rollupOptions: {
      output: {
        manualChunks(id) {
          if (id.includes("node_modules")) {
            return id
              .toString()
              .split("node_modules/")[1]
              .split("/")[0]
              .toString();
          }
        },
      },
    },
  },
});
