import { NextRequest } from "next/server";
import { SupportMessageSender, 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 { supportTicketInclude } from "@/server/support/includes";
import { serializeSupportTicket } from "@/server/support/serializers";

const createTicketSchema = z.object({
  subject: z.string().trim().min(4).max(120),
  category: z.string().trim().min(2).max(40).default("Compte"),
  message: z.string().trim().min(10).max(3000)
});

export const dynamic = "force-dynamic";

export async function GET(request: NextRequest) {
  try {
    const { user } = await requireUser(request);
    const tickets = await prisma.supportTicket.findMany({
      where: { userId: user.id },
      include: supportTicketInclude(),
      orderBy: { lastMessageAt: "desc" },
      take: 30
    });

    return ok({ tickets: tickets.map(serializeSupportTicket) });
  } catch (error) {
    return fail(error);
  }
}

export async function POST(request: NextRequest) {
  try {
    const { user } = await requireUser(request);
    const input = await parseJson(request, createTicketSchema);
    const ticket = await prisma.supportTicket.create({
      data: {
        userId: user.id,
        subject: input.subject,
        category: input.category,
        status: SupportTicketStatus.WAITING_SUPPORT,
        messages: {
          create: {
            senderUserId: user.id,
            senderRole: SupportMessageSender.USER,
            body: input.message
          }
        }
      },
      include: supportTicketInclude()
    });

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