import { NextRequest } from "next/server";
import { LiveChatStatus } from "@prisma/client";
import { z } from "zod";
import { prisma } from "@/server/db";
import { AppError } from "@/server/errors";
import { fail, ok, parseJson } from "@/server/http";
import { requireUser } from "@/server/security/auth";
import { liveChatConversationInclude } from "@/server/support/includes";
import { serializeLiveChatConversation } from "@/server/support/serializers";

const patchSchema = z.discriminatedUnion("action", [
  z.object({ action: z.literal("close") }),
  z.object({
    action: z.literal("rate"),
    rating: z.number().int().min(1).max(5),
    comment: z.string().trim().max(500).optional()
  })
]);

export const dynamic = "force-dynamic";

export async function PATCH(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  try {
    const { user } = await requireUser(request);
    const { id } = await params;
    const input = await parseJson(request, patchSchema);
    const conversation = await prisma.liveChatConversation.findUniqueOrThrow({ where: { id } });
    if (conversation.userId !== user.id) {
      throw new AppError("Discussion introuvable.", 404, "LIVECHAT_NOT_FOUND");
    }

    const updatedConversation = await prisma.liveChatConversation.update({
      where: { id },
      data:
        input.action === "close"
          ? { status: LiveChatStatus.CLOSED, closedAt: new Date() }
          : { rating: input.rating, ratingComment: input.comment, ratedAt: new Date() },
      include: liveChatConversationInclude()
    });

    return ok({ conversation: serializeLiveChatConversation(updatedConversation) });
  } catch (error) {
    return fail(error);
  }
}
