import { Types } from "mongoose";
import { connectDB } from "@/lib/db";
import { Order, Vendor } from "@/models";
import { paginatedResponse, notFoundResponse } from "@/lib/api/response";
import { NotFoundError } from "@/lib/api/errors";
import { rateLimitByUser } from "@/lib/api/rate-limit-middleware";
import { getSettings } from "@/models/settings.model";
import { isDefaultVendorRecord } from "@/lib/multi-vendor";
import { withApi } from "@/lib/api/handler";

/**
 * GET /api/admin/vendors/[id]/orders
 * Paginated order history for a single vendor. Orders carry the vendor linkage
 * on `subOrders[].vendorId` (see the `{ "subOrders.vendorId": 1 }` index), so
 * we match that rather than a top-level field.
 */
export const GET = withApi<{ id: string }>(
  { auth: "admin" },
  async ({ request, params, session }) => {
    await rateLimitByUser(
      request,
      session.user.id,
      "admin:vendors:orders",
      "lenient",
      session.user.role,
    );

    const { id } = params;
    if (!Types.ObjectId.isValid(id)) {
      return notFoundResponse("Vendor");
    }

    await connectDB();
    const settings = await getSettings();
    if (!settings.multiVendorMode?.enabled) throw new NotFoundError("Vendor");

    const vendor = await Vendor.findById(id).select("isDefault slug").lean();
    if (!vendor || isDefaultVendorRecord(vendor)) {
      return notFoundResponse("Vendor");
    }

    const url = new URL(request.url);
    const page = Math.max(1, Number(url.searchParams.get("page")) || 1);
    const limit = Math.min(
      50,
      Math.max(1, Number(url.searchParams.get("limit")) || 10),
    );
    const skip = (page - 1) * limit;

    const query = { "subOrders.vendorId": new Types.ObjectId(id) };

    const [orders, total] = await Promise.all([
      Order.find(query)
        .select(
          "orderNumber status paymentStatus total currency channel createdAt refundedTotal items",
        )
        .sort({ createdAt: -1 })
        .skip(skip)
        .limit(limit)
        .lean(),
      Order.countDocuments(query),
    ]);

    const items = orders.map((order) => ({
      _id: String(order._id),
      orderNumber: order.orderNumber,
      status: order.status,
      paymentStatus: order.paymentStatus,
      total: order.total ?? 0,
      currency: order.currency,
      channel: order.channel,
      itemCount: Array.isArray(order.items) ? order.items.length : 0,
      refundedTotal: order.refundedTotal ?? 0,
      createdAt: order.createdAt,
    }));

    return paginatedResponse(items, page, limit, total);
  },
);
