import { quoteCart } from '@/lib/commerce';
export async function POST(request: Request) {
  if (!request.headers.get('content-type')?.includes('application/json'))
    return Response.json(
      {
        error: {
          code: 'CONTENT_TYPE',
          message: 'Используйте application/json.',
        },
      },
      { status: 415 },
    );
  const reader = request.body?.getReader();
  if (!reader)
    return Response.json(
      { error: { code: 'EMPTY_BODY', message: 'Пустой запрос.' } },
      { status: 400 },
    );
  const parts: Uint8Array[] = [];
  let length = 0;
  try {
    while (true) {
      const { done, value } = await reader.read();
      if (done) break;
      length += value.byteLength;
      if (length > 16384) {
        await reader.cancel();
        return Response.json(
          { error: { code: 'TOO_LARGE', message: 'Максимум 16 КБ.' } },
          { status: 413 },
        );
      }
      parts.push(value);
    }
  } catch {
    return Response.json(
      {
        error: { code: 'READ_ERROR', message: 'Не удалось прочитать запрос.' },
      },
      { status: 400 },
    );
  }
  const bytes = new Uint8Array(length);
  let offset = 0;
  for (const p of parts) {
    bytes.set(p, offset);
    offset += p.length;
  }
  let data: unknown;
  try {
    data = JSON.parse(new TextDecoder().decode(bytes));
  } catch {
    return Response.json(
      { error: { code: 'INVALID_JSON', message: 'Некорректный JSON.' } },
      { status: 400 },
    );
  }
  try {
    return Response.json(quoteCart(data), {
      headers: { 'Cache-Control': 'no-store' },
    });
  } catch (e) {
    return Response.json(
      {
        error: {
          code: 'INVALID_CART',
          message: e instanceof Error ? e.message : 'Ошибка корзины.',
        },
      },
      { status: 422 },
    );
  }
}
