import Fastify from "fastify";
import cors from "@fastify/cors";

import { getConfig } from "./config.js";
import { initializeDatabase } from "./db/mariadb.js";
import { registerAiRoutes } from "./routes/ai.js";
import { registerAuthRoutes } from "./routes/auth.js";
import { registerHealthRoutes } from "./routes/health.js";
import { registerProofreadRoutes } from "./routes/proofread.js";
import { registerReferenceRoutes } from "./routes/references.js";
import { registerSettingsRoutes } from "./routes/settings.js";

async function start(): Promise<void> {
  const config = getConfig();
  const app = Fastify({
    logger: true
  });

  app.setErrorHandler((error, _request, reply) => {
    const publicMessage =
      error instanceof Error && error.message ? error.message : "Unexpected server error.";
    const statusCode =
      publicMessage === "Login required."
        ? 401
        : publicMessage.includes("not configured") || publicMessage.includes("MariaDB")
          ? 500
          : 400;

    reply.code(statusCode).send({
      ok: false,
      message: publicMessage
    });
  });

  await initializeDatabase();

  await app.register(cors, {
    origin: config.corsOrigin
  });

  await registerHealthRoutes(app);
  await registerAuthRoutes(app);
  await registerProofreadRoutes(app);
  await registerAiRoutes(app);
  await registerReferenceRoutes(app);
  await registerSettingsRoutes(app);

  await app.listen({
    host: "0.0.0.0",
    port: config.port
  });
}

start().catch((error) => {
  console.error(error);
  process.exit(1);
});
