import { NextResponse } from "next/server" import { and, eq } from "drizzle-orm" import { db } from "@/lib/db" import { properties, maintenance_requests } from "@/lib/db/schema" import { getSessionUser } from "@/lib/session" import { openai } from "@/lib/ai/client" import { MAINTENANCE_SUMMARY_PROMPT, dataBlock } from "@/lib/ai/prompts" import { enforceAiQuota } from "@/lib/ai/usage" export async function POST(request: Request) { const user = await getSessionUser() if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }) const quota = await enforceAiQuota(user.id, "ai_maintenance_summary") if (!quota.ok) return NextResponse.json({ error: quota.error }, { status: quota.status }) const { property_id } = await request.json() as { property_id: string } const requests = await db .select({ title: maintenance_requests.title, description: maintenance_requests.description, category: maintenance_requests.category, priority: maintenance_requests.priority, status: maintenance_requests.status, estimated_cost: maintenance_requests.estimated_cost, actual_cost: maintenance_requests.actual_cost, created_at: maintenance_requests.created_at, resolved_at: maintenance_requests.resolved_at, }) .from(maintenance_requests) .where(and(eq(maintenance_requests.user_id, user.id), eq(maintenance_requests.property_id, property_id))) const property = await db.query.properties.findFirst({ where: and(eq(properties.id, property_id), eq(properties.user_id, user.id)), columns: { name: true }, }) const completion = await openai.chat.completions.create({ model: "gpt-4o-mini", max_tokens: 1024, messages: [ { role: "system", content: MAINTENANCE_SUMMARY_PROMPT }, { role: "user", content: `${dataBlock("PROPERTY NAME", property?.name ?? "Unknown")}\n\n${dataBlock("MAINTENANCE REQUESTS", JSON.stringify(requests, null, 2))}`, }, ], }) const text = completion.choices[0].message.content ?? "" let summary try { summary = JSON.parse(text.replace(/```json\n?/g, "").replace(/```\n?/g, "").trim()) } catch { return NextResponse.json({ error: "Failed to parse AI response" }, { status: 500 }) } return NextResponse.json(summary) }