import { NextResponse } from "next/server";
import {
  applyCartSessionCookies,
  getCartSessionFromRequestCookies,
  normalizeStorefrontCart,
  removeStorefrontCartItem,
  updateStorefrontCartItem,
} from "@/lib/storefront-cart";

interface CartItemRouteContext {
  params: Promise<{
    key: string;
  }>;
}

export async function PATCH(request: Request, context: CartItemRouteContext) {
  try {
    const { key } = await context.params;
    const body = (await request.json()) as {
      quantity?: number;
    };

    if (!Number.isInteger(body.quantity) || Number(body.quantity) < 1) {
      return NextResponse.json(
        { message: "Količina mora biti najmanje 1." },
        { status: 400 },
      );
    }

    const session = await getCartSessionFromRequestCookies();
    const result = await updateStorefrontCartItem(
      session,
      key,
      Number(body.quantity),
    );
    const cart = await normalizeStorefrontCart(result.payload);
    const response = NextResponse.json(cart);

    applyCartSessionCookies(response, result.session);

    return response;
  } catch (error) {
    return NextResponse.json(
      {
        message:
          error instanceof Error
            ? error.message
            : "Ažuriranje košarice nije uspjelo.",
      },
      { status: 500 },
    );
  }
}

export async function DELETE(
  _request: Request,
  context: CartItemRouteContext,
) {
  try {
    const { key } = await context.params;
    const session = await getCartSessionFromRequestCookies();
    const result = await removeStorefrontCartItem(session, key);
    const cart = await normalizeStorefrontCart(result.payload);
    const response = NextResponse.json(cart);

    applyCartSessionCookies(response, result.session);

    return response;
  } catch (error) {
    return NextResponse.json(
      {
        message:
          error instanceof Error
            ? error.message
            : "Uklanjanje proizvoda nije uspjelo.",
      },
      { status: 500 },
    );
  }
}
