import { NextRequest, NextResponse } from "next/server"
import { createClient } from "@/lib/supabase/server"
import { createAdminClient } from "@/lib/supabase/admin"

export async function GET(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id } = await params
    const supabase = await createClient()

    // Get current user
    const {
      data: { user },
      error: authError,
    } = await supabase.auth.getUser()

    if (authError || !user) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 })
    }

    // Check if user is admin
    const adminClient = createAdminClient()
    const { data: userProfile } = await adminClient.from("users").select("role").eq("id", user.id).single()
    const isAdmin = userProfile?.role === "admin"

    // Get query parameters for filtering
    const { searchParams } = new URL(request.url)
    const from = searchParams.get("from")
    const to = searchParams.get("to")
    const paymentStatus = searchParams.get("payment_status")

    // Use admin client for admins, regular client for organizers
    const ordersClient = isAdmin ? adminClient : supabase

    // Verify event access - admins can access any event, organizers only their own
    if (!isAdmin) {
      const { data: event } = await supabase
        .from("events")
        .select("organizer_id")
        .eq("id", id)
        .single()

      if (!event || event.organizer_id !== user.id) {
        return NextResponse.json({ error: "Forbidden" }, { status: 403 })
      }
    }

    // Build query
    let query = ordersClient
      .from("orders")
      .select("*, chits(*)")
      .eq("event_id", id)
      .order("created_at", { ascending: false })

    // Apply date filters if provided
    if (from) {
      query = query.gte("created_at", from)
    }
    if (to) {
      const toDate = new Date(to)
      toDate.setHours(23, 59, 59, 999)
      query = query.lte("created_at", toDate.toISOString())
    }

    // Apply payment status filter if provided
    if (paymentStatus) {
      query = query.eq("payment_status", paymentStatus)
    }

    const { data: orders, error: ordersError } = await query

    if (ordersError) {
      console.error("[API] Error fetching orders:", ordersError)
      return NextResponse.json({ error: "Failed to fetch orders" }, { status: 500 })
    }

    // Get menu item images if needed
    if (orders && orders.length > 0) {
      const menuItemIds = new Set<string>()
      orders.forEach((order: any) => {
        order.chits?.forEach((chit: any) => {
          if (chit.menu_item_id) menuItemIds.add(chit.menu_item_id)
        })
      })

      if (menuItemIds.size > 0) {
        const menuItemsClient = isAdmin ? adminClient : supabase
        const { data: menuItems } = await menuItemsClient
          .from("menu_items")
          .select("id, image_url")
          .in("id", Array.from(menuItemIds))

        if (menuItems) {
          const imageMap = new Map(menuItems.map((item) => [item.id, item.image_url]))
          orders.forEach((order: any) => {
            order.chits?.forEach((chit: any) => {
              if (chit.menu_item_id) {
                chit.menu_item_image = imageMap.get(chit.menu_item_id)
              }
            })
          })
        }
      }
    }

    return NextResponse.json({ orders: orders || [] })
  } catch (error: any) {
    console.error("[API] Error in event orders route:", error)
    return NextResponse.json({ error: error.message || "Internal server error" }, { status: 500 })
  }
}
