import { Router, Request, Response, NextFunction } from "express";
import swaggerUi from "swagger-ui-express";
import { getOpenApiDocument } from "./generator";
import { env } from "../../config/env";

const router = Router();

// Gating middleware
function swaggerGuard(req: Request, res: Response, next: NextFunction) {
  if (env.NODE_ENV === "production" && !env.SWAGGER_ENABLED) {
    return res.status(404).json({
      success: false,
      message: "API documentation is disabled in this environment",
    });
  }
  next();
}

router.use(swaggerGuard);

// Raw JSON endpoint
router.get("/openapi.json", (_req: Request, res: Response) => {
  res.setHeader("Content-Type", "application/json");
  res.setHeader(
    "Cache-Control",
    "no-store, no-cache, must-revalidate, proxy-revalidate",
  );
  res.send(getOpenApiDocument());
});

// Swagger UI options optimized for 2026
const swaggerUiOptions: swaggerUi.SwaggerUiOptions = {
  customCss:
    '.swagger-ui .topbar { display: none } .swagger-ui { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; }',
  customSiteTitle: "SGMS API Documentation",
  swaggerOptions: {
    persistAuthorization: true,
    displayRequestDuration: true,
    docExpansion: "list",
    filter: true,
  },
};

router.use(
  "/",
  swaggerUi.serveFiles(undefined, {
    swaggerUrl: "/api/docs/openapi.json",
    ...swaggerUiOptions,
  }),
  swaggerUi.setup(undefined, {
    swaggerUrl: "/api/docs/openapi.json",
    ...swaggerUiOptions,
  }),
);

export default router;
