import { config as loadEnv } from "dotenv";
loadEnv();

import { createVaultClient } from "./vault.js";
import { setOptionsProvider, ZodRoute } from "./util.js";

// Conditional vault import to avoid configuration errors
let vault: any = null;
try {
  // Use require for conditional import
  vault = createVaultClient();
} catch (error) {
  // Vault not configured, continue without it
  console.warn("Vault not configured, continuing without vault support");
}

setOptionsProvider(async () => ({ vault }));

import express from "express";
import { createConfig, createServer, Routing } from "express-zod-api";
import { logger, loggerMiddleware } from "../middleware/logger/logger.js";
import cookieParser from "cookie-parser";
import { DocumentationParams } from "./server.types.js";

const routing = (params: DocumentationParams): Routing => {
  return params.routes;
};

export const startServer = async (
  params: DocumentationParams
): ReturnType<typeof createServer> => {
  // Configure express-zod-api
  const config = createConfig({
    http: {
      listen: params.port,
    },
    cors: true,
    logger,
    startupLogo: false,
    beforeRouting: ({ app }) => {
      app.use(cookieParser());
      app.use(express.json());
      app.use(loggerMiddleware);
    },
  });

  // Create and start the server
  const { app, servers } = await createServer(config, routing(params));

  logger.info(`App running on port ${params.port}`);

  return { app, servers, logger };
};
