import { NextResponse } from "next/server"
import { and, desc, eq } from "drizzle-orm"
import { db } from "@/lib/db"
import { expenses } from "@/lib/db/schema"
import { getSessionUser } from "@/lib/session"
import { toCsv } from "@/lib/db/admin-queries"
import { getEffectiveOwnerId } from "@/lib/account"

export async function GET(request: Request) {
  const user = await getSessionUser()
  if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 })

  const ownerId = await getEffectiveOwnerId(user.id)

  const { searchParams } = new URL(request.url)
  const propertyId = searchParams.get("property_id")

  const data = await db.query.expenses.findMany({
    where: and(
      eq(expenses.user_id, ownerId),
      propertyId ? eq(expenses.property_id, propertyId) : undefined
    ),
    with: {
      property: { columns: { name: true } },
    },
    orderBy: desc(expenses.expense_date),
  })

  const csv = toCsv(
    ["Date", "Description", "Category", "Amount", "Property", "Vendor", "Recurring", "Recurrence", "Notes"],
    data.map((e) => [
      e.expense_date,
      e.description,
      e.category,
      e.amount,
      e.property?.name ?? "",
      e.vendor ?? "",
      e.is_recurring ? "Yes" : "No",
      e.recurrence ?? "",
      e.notes ?? "",
    ])
  )

  return new Response(csv, {
    headers: {
      "Content-Type": "text/csv",
      "Content-Disposition": `attachment; filename="expenses-${new Date().toISOString().slice(0, 10)}.csv"`,
    },
  })
}
