import { NextRequest } from "next/server";
import { Role, SupportTicketPriority, SupportTicketStatus } from "@prisma/client";
import { z } from "zod";
import { prisma } from "@/server/db";
import { fail, ok, parseJson } from "@/server/http";
import { requireUser } from "@/server/security/auth";
import { requireRole } from "@/server/security/rbac";
import { supportTicketInclude } from "@/server/support/includes";
import { serializeSupportTicket } from "@/server/support/serializers";

const schema = z.object({
  status: z.nativeEnum(SupportTicketStatus).optional(),
  priority: z.nativeEnum(SupportTicketPriority).optional(),
  assignToMe: z.boolean().optional()
});

export const dynamic = "force-dynamic";

export async function PATCH(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  try {
    const auth = await requireUser(request);
    requireRole(auth.roles, [Role.SUPPORT, Role.ADMIN, Role.SUPER_ADMIN]);
    const { id } = await params;
    const input = await parseJson(request, schema);
    const ticket = await prisma.supportTicket.update({
      where: { id },
      data: {
        status: input.status,
        priority: input.priority,
        assignedAdminId: input.assignToMe ? auth.user.id : undefined,
        closedAt: input.status === SupportTicketStatus.CLOSED || input.status === SupportTicketStatus.RESOLVED ? new Date() : undefined
      },
      include: supportTicketInclude()
    });

    return ok({ ticket: serializeSupportTicket(ticket) });
  } catch (error) {
    return fail(error);
  }
}
