import path from "node:path";
import fs from "node:fs";
import cookieParser from "cookie-parser";
import cors from "cors";
import express from "express";
import { config } from "./config.js";
import { attachUser } from "./middleware/auth.js";
import { authRouter } from "./routes/auth.js";
import { adminRouter } from "./routes/admin.js";
import { examCardsRouter } from "./routes/examCards.js";
import { meRouter } from "./routes/me.js";
import { paymentsRouter } from "./routes/payments.js";
import { registrationsRouter } from "./routes/registrations.js";
import { uploadsRouter } from "./routes/uploads.js";
import { setupSwagger } from "./swagger.js";

const uploadDir = path.join(process.cwd(), "uploads");

export function createApp() {
  const app = express();
  app.disable("x-powered-by");
  app.use(
    cors({
      origin: config.corsOrigin,
      credentials: true,
    }),
  );
  app.use(cookieParser());
  app.use(express.json({ limit: "2mb" }));
  app.use(attachUser);

  if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true });
  }

  const api = express.Router();
  api.use("/uploads", express.static(uploadDir));
  api.get("/health", (_req, res) => {
    res.json({ ok: true });
  });

  setupSwagger(api);

  api.use("/auth", authRouter);
  api.use("/me", meRouter);
  api.use("/registrations", registrationsRouter);
  api.use("/payments", paymentsRouter);
  api.use("/exam-cards", examCardsRouter);
  api.use("/uploads/v1", uploadsRouter);
  api.use("/admin", adminRouter);

  api.use((_req, res) => {
    res.status(404).json({ message: "یافت نشد." });
  });

  app.use("/api", api);

  app.use((_req, res) => {
    res.status(404).json({ message: "یافت نشد." });
  });

  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  app.use((err: unknown, _req: express.Request, res: express.Response, _next: express.NextFunction) => {
    // eslint-disable-next-line no-console
    console.error(err);
    res.status(500).json({ message: "خطای سرور." });
  });

  return app;
}
