// MealPrep — Fastify Backend Server
import Fastify from "fastify";
import cors from "@fastify/cors";
import fjwt from "@fastify/jwt";
import { initDb, closeDb } from "./db/client.js";
import { authRoutes } from "./routes/auth.js";
import { usersRoutes } from "./routes/users.js";
import { foodsRoutes } from "./routes/foods.js";
import { customersRoutes } from "./routes/customers.js";
import { meal_plansRoutes } from "./routes/meal_plans.js";
import { nutritionRoutes } from "./routes/nutrition.js";
import { shopping_listsRoutes } from "./routes/shopping_lists.js";
import { templatesRoutes } from "./routes/templates.js";
import { productsRoutes } from "./routes/products.js";
import { ordersRoutes } from "./routes/orders.js";
import { order_itemsRoutes } from "./routes/order_items.js";
import { logisticsRoutes } from "./routes/logistics.js";

const JWT_SECRET = process.env.JWT_SECRET || "change-me-in-production-455b54e9";

export async function buildApp() {
  const app = Fastify({
    logger: {
      level: process.env.LOG_LEVEL || "info",
      transport: process.env.NODE_ENV !== "production"
        ? { target: "pino-pretty", options: { colorize: true } }
        : undefined,
    },
  });

  // Init database
  await initDb();

  // Plugins
  await app.register(cors, {
    origin: process.env.CORS_ORIGIN || "*",
    methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
  });

  await app.register(fjwt, { secret: JWT_SECRET });

  // Routes
  await app.register(authRoutes, { prefix: "/api/auth" });
  await app.register(usersRoutes, { prefix: "/api/users" });
  await app.register(foodsRoutes, { prefix: "/api/foods" });
  await app.register(customersRoutes, { prefix: "/api/customers" });
  await app.register(meal_plansRoutes, { prefix: "/api/meal_plans" });
  await app.register(nutritionRoutes, { prefix: "/api/nutrition" });
  await app.register(shopping_listsRoutes, { prefix: "/api/shopping_lists" });
  await app.register(templatesRoutes, { prefix: "/api/templates" });
  await app.register(productsRoutes, { prefix: "/api/products" });
  await app.register(ordersRoutes, { prefix: "/api/orders" });
  await app.register(order_itemsRoutes, { prefix: "/api/order_items" });
  await app.register(logisticsRoutes, { prefix: "/api/logistics" });

  // Health check
  app.get("/api/health", async () => ({ status: "ok", timestamp: new Date().toISOString() }));

  // Graceful shutdown
  app.addHook("onClose", async () => {
    closeDb();
  });

  return app;
}

// Start server if called directly
const port = parseInt(process.env.PORT || "3001", 10);
const host = process.env.HOST || "0.0.0.0";

async function main() {
  const app = await buildApp();
  try {
    await app.listen({ port, host });
  } catch (err) {
    app.log.error(err);
    process.exit(1);
  }
}

main();
