import { NextResponse } from "next/server";
import { getCollection } from "@/lib/mongodb";

export async function POST(request: Request) {
  try {
    const orderData = await request.json();

    // Validate required fields
    if (!orderData.customer || !orderData.items || !Array.isArray(orderData.items)) {
      return NextResponse.json(
        { error: "Invalid order data. Customer and items are required." },
        { status: 400 }
      );
    }

    if (orderData.items.length === 0) {
      return NextResponse.json(
        { error: "Order must contain at least one item." },
        { status: 400 }
      );
    }

    // Get orders collection
    const ordersCollection = await getCollection<any>("orders");

    // Create order document
    const order = {
      customer: {
        name: orderData.customer.name || "",
        email: orderData.customer.email || "",
        phone: orderData.customer.phone || "",
        address: orderData.customer.address || "",
        city: orderData.customer.city || "",
        postalCode: orderData.customer.postalCode || "",
        country: orderData.customer.country || "",
      },
      items: orderData.items.map((item: any) => ({
        productId: item.productId,
        name: item.name || item.title || "",
        title: item.name || item.title || "",
        sku: item.sku || "",
        price: item.price || 0,
        quantity: item.quantity || 0,
      })),
      total: orderData.total || orderData.totalPrice || 0,
      totalItems: orderData.totalItems || orderData.items.reduce((sum: number, item: any) => sum + (item.quantity || 0), 0),
      totalPrice: orderData.total || orderData.totalPrice || 0,
      status: orderData.status || "pending",
      createdAt: orderData.createdAt || new Date().toISOString(),
      updatedAt: new Date().toISOString(),
    };

    // Insert order into MongoDB
    const result = await ordersCollection.insertOne(order);

    return NextResponse.json(
      {
        success: true,
        orderId: result.insertedId.toString(),
        message: "Order placed successfully",
      },
      { status: 201 }
    );
  } catch (error) {
    console.error("Error creating order:", error);
    return NextResponse.json(
      { error: "Failed to create order" },
      { status: 500 }
    );
  }
}

// GET endpoint to retrieve orders (optional, for admin use)
export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const limit = parseInt(searchParams.get("limit") || "50", 10);
    const skip = parseInt(searchParams.get("skip") || "0", 10);
    const email = searchParams.get("email")?.trim().toLowerCase() || "";

    const ordersCollection = await getCollection<any>("orders");

    // Build query - if email provided, restrict to that customer's orders
    const query: any = {};
    if (email) {
      // Support both string address and object address structures in older orders
      query["customer.email"] = email;
    }

    const orders = await ordersCollection
      .find(query)
      .sort({ createdAt: -1 })
      .skip(skip)
      .limit(limit)
      .toArray();

    const total = await ordersCollection.countDocuments(query);
    const normalized = orders.map((o: any) => ({
      ...o,
      _id: o._id?.toString?.() ?? String(o._id),
    }));

    return NextResponse.json({
      orders: normalized,
      pagination: {
        total,
        limit,
        skip,
      },
    });
  } catch (error) {
    console.error("Error fetching orders:", error);
    return NextResponse.json(
      { error: "Failed to fetch orders" },
      { status: 500 }
    );
  }
}

