import { NextResponse } from "next/server";
import { z } from "zod";
import { quoteBotDelivery } from "@/lib/bot-api";
import { ApiRequestError, checkRateLimit, readJson } from "@/lib/api-security";

const schema = z.object({ address: z.string().min(5).max(300), orderTotal: z.number().finite().nonnegative().max(1_000_000).optional() });

/** Proxy of bot POST /api/delivery/quote (contract §3в.1). */
export async function POST(request: Request) {
  try {
    checkRateLimit(request, "delivery-quote", 30);
    const parsed = schema.safeParse(await readJson<unknown>(request, 8 * 1024));
    if (!parsed.success) return NextResponse.json({ error: "bad_request", message: "Проверьте адрес." }, { status: 400 });
    const quote = await quoteBotDelivery(parsed.data.address, parsed.data.orderTotal ?? 0);
    return NextResponse.json({
      normalizedAddress: quote.normalized_address,
      zone: quote.zone ? { name: quote.zone.name, minOrder: quote.zone.min_order, freeFrom: quote.zone.free_from } : null,
      deliveryFee: quote.delivery_fee,
      totalWithDelivery: quote.total_with_delivery
    }, { headers: { "Cache-Control": "no-store" } });
  } catch (error) {
    const status = error instanceof ApiRequestError ? error.status : (typeof (error as { status?: unknown })?.status === "number" ? Number((error as { status: number }).status) : 502);
    const body = (error as { body?: Record<string, unknown> })?.body;
    return NextResponse.json({ error: body?.error || "delivery_unavailable", message: body?.message || "Не удалось рассчитать доставку. Позвоните нам — поможем оформить заказ." }, { status });
  }
}
