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 { getEffectiveOwnerId } from "@/lib/account" import { aiConfigured, AI_UNCONFIGURED_ERROR } from "@/lib/ai/client" import { aiComplete } from "@/lib/ai/provider" 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 }) // Before the quota check so an unconfigured server never burns a call. if (!aiConfigured()) return NextResponse.json({ error: AI_UNCONFIGURED_ERROR }, { status: 503 }) const quota = await enforceAiQuota(user.id, "ai_maintenance_summary") if (!quota.ok) return NextResponse.json({ error: quota.error }, { status: quota.status }) const ownerId = await getEffectiveOwnerId(user.id) 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, ownerId), 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, ownerId)), columns: { name: true }, }) const text = await aiComplete({ 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))}`, }, ], maxTokens: 1024, json: true, }) let summary try { summary = JSON.parse(text) } catch { return NextResponse.json({ error: "Failed to parse AI response" }, { status: 500 }) } return NextResponse.json(summary) }