import { z } from "zod";
import { TicketsSchema, prisma } from "#lib/server/prisma";
import { defineApiRoute } from "astro-typesafe-api/server";
import { maybeAuthorizationMiddleware } from "#lib/middleware/authorization.js";
import { UUidWithPrefix } from "#components/Ausweis/types.js";

export const PUT = defineApiRoute({
	meta: {
		contentTypes: ["application/json"],
		description:
			"Erstellt ein neues Support Ticket und weist den Ersteller diesem zu, falls ein Authorization Header mitgegeben wurde.",
		summary: "Erstellt ein neues Support Ticket.",
		tags: ["Tickets"],
	},
	input: TicketsSchema.omit({
		bearbeiter_id: true,
		benutzer_id: true,
		created_at: true,
		deleted_at: true,
		id: true,
		prioritaet: true,
		status: true,
		uid: true,
		updated_at: true,
	}),
	output: z.object({
		uid: UUidWithPrefix,
	}),
	middleware: maybeAuthorizationMiddleware,
	async fetch(input, ctx, user) {
		if (user === null) {
			// Der Benutzer ist nicht authentifiziert.
			// Wir erstellen das Ticket anonym.
			const ticket = await prisma.tickets.create({
				data: {
					beschreibung: input.beschreibung,
					email: input.email,
					titel: input.titel,
					metadata: input.metadata,
				},
				select: {
					uid: true,
				},
			});

			return {
				uid: ticket.uid,
			};
		}

		// Der Benutzer ist authentifiziert.
		// Wir verlinken den Benutzer und das Ticket.
		const ticket = await prisma.tickets.create({
			data: {
				benutzer: {
					connect: {
						id: user.id,
					},
				},
				beschreibung: input.beschreibung,
				email: input.email,
				titel: input.titel,
				metadata: input.metadata,
			},
			select: {
				uid: true,
			},
		});

		return {
			uid: ticket.uid,
		};
	},
});
