import { NextResponse } from "next/server";
import { z } from "zod";
import { getBotInfo, 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, info] = await Promise.all([
      quoteBotDelivery(parsed.data.address, parsed.data.orderTotal ?? null, parsed.data.orderTotal === undefined ? "conditions" : "checkout"),
      getBotInfo()
    ]);
    return NextResponse.json({
      normalizedAddress: quote.normalized_address,
      zone: quote.zone ? { minOrder: quote.zone.min_order, freeFrom: quote.zone.free_from, deliveryTimeMin: quote.zone.delivery_time_min ?? null, thresholds: quote.zone.thresholds || [] } : null,
      eligible: quote.eligible ?? true,
      orderSubtotal: quote.order_subtotal ?? parsed.data.orderTotal ?? null,
      shortfall: quote.shortfall ?? 0,
      deliveryFee: quote.delivery_fee,
      totalWithDelivery: quote.total_with_delivery,
      cookTimeMin: info.delivery.cook_time_min ?? null,
      assemblyTimeMin: info.delivery.assembly_time_min ?? null,
      highloadCookAddMin: info.delivery.highload_cook_add_min ?? null,
      highloadAssemblyAddMin: info.delivery.highload_assembly_add_min ?? null,
      highloadDeliveryAddMin: info.delivery.highload_delivery_add_min ?? null
    }, { 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;
    if (body?.error === "min_sum") {
      const zone = body.zone as { min_order?: number; free_from?: number | null; delivery_time_min?: number; thresholds?: { from: number; price: number }[] } | undefined;
      return NextResponse.json({
        error: "min_sum",
        eligible: false,
        normalizedAddress: body.normalized_address,
        zone: zone ? { minOrder: Number(zone.min_order || body.min_order || 0), freeFrom: zone.free_from ?? body.free_from ?? null, deliveryTimeMin: zone.delivery_time_min ?? null, thresholds: zone.thresholds || [] } : { minOrder: Number(body.min_order || 0), freeFrom: body.free_from ?? null, deliveryTimeMin: null, thresholds: [] },
        orderSubtotal: Number(body.order_subtotal || 0),
        shortfall: Number(body.shortfall || 0),
        deliveryFee: Number(body.delivery_fee || 0),
        totalWithDelivery: Number(body.total_with_delivery || body.order_subtotal || 0),
        message: "Сумма заказа пока меньше минимальной."
      }, { status: 400, headers: { "Cache-Control": "no-store" } });
    }
    const errorCode = String(body?.error || "delivery_unavailable");
    const messages: Record<string, string> = {
      zone_unknown: "По этому адресу доставка недоступна. Проверьте адрес или выберите самовывоз.",
      delivery_auth_failed: "Расчёт доставки временно недоступен. Попробуйте позже или выберите самовывоз.",
      delivery_unavailable: "Не удалось рассчитать доставку. Попробуйте позже или выберите самовывоз.",
      bad_request: "Проверьте адрес доставки."
    };
    return NextResponse.json({ error: errorCode, message: messages[errorCode] || "Не удалось рассчитать доставку. Попробуйте позже или выберите самовывоз." }, { status });
  }
}
