import { defineConfig } from "vite";
import solidPlugin from "vite-plugin-solid";
import devtools from "solid-devtools/vite";
import tsconfigPaths from "vite-tsconfig-paths";
import oauthMetadata from "./src/lib/oauthMetadata.json";

export const makeOauthMetadata = (
  client_id: string,
  client_uri: string,
  redirect_uri: string,
  scope: string,
) => ({
  ...oauthMetadata,
  client_id,
  client_uri,
  logo_uri: `${client_uri}/favicon.png`,
  redirect_uris: [redirect_uri],
  scope,
});

export default defineConfig({
  plugins: [
    {
      name: "oauth-metadata",
      config(_conf, { command }) {
        if (command !== "build") {
          process.env.VITE_CLIENT_URI = "http://localhost:3000";
          const redirectUri = "http://127.0.0.1:3000";
          process.env.VITE_OAUTH_REDIRECT_URL = redirectUri;
          const scope = oauthMetadata.scope;
          process.env.VITE_OAUTH_SCOPE = scope;
          process.env.VITE_OAUTH_CLIENT_ID =
            `http://localhost` +
            `?redirect_uri=${encodeURIComponent(redirectUri)}` +
            `&scope=${encodeURIComponent(scope)}`;
        }
      },
      configureServer(server) {
        server.middlewares.use((req, res, next) => {
          if (req.headers.host?.startsWith("127.0.0.1")) {
            const newUrl = `http://localhost:${req.headers.host.split(":")[1] || "3000"}${req.url}`;
            res.writeHead(301, { Location: newUrl });
            res.end();
            return;
          }
          next();
        });
        server.middlewares.use((req, res, next) => {
          if (req.url === "/oauth-client-metadata.json") {
            res.setHeader("Content-Type", "application/json");
            res.end(
              JSON.stringify(
                makeOauthMetadata(
                  process.env.VITE_OAUTH_CLIENT_ID!,
                  process.env.VITE_CLIENT_URI!,
                  process.env.VITE_OAUTH_REDIRECT_URL!,
                  process.env.VITE_OAUTH_SCOPE!,
                ),
                null,
                2,
              ),
            );
            return;
          }
          next();
        });
      },
      generateBundle() {
        this.emitFile({
          type: "asset",
          fileName: "oauth-client-metadata.json",
          source: JSON.stringify(
            makeOauthMetadata(
              process.env.VITE_OAUTH_CLIENT_ID!,
              process.env.VITE_CLIENT_URI!,
              process.env.VITE_OAUTH_REDIRECT_URL!,
              process.env.VITE_OAUTH_SCOPE!,
            ),
            null,
            2,
          ),
        });
      },
    },
    devtools(),
    solidPlugin(),
    tsconfigPaths({ root: "./" }),
  ],
  server: {
    host: "0.0.0.0",
    port: 3000,
  },
  build: {
    target: "esnext",
  },
});
