import { getAusweisartFromUUID, UUidWithPrefix } from "#components/Ausweis/types.js";
import { omit } from "#lib/helpers.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, GEGEinpreisungSchema, prisma } from "#lib/server/prisma";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";

export const PUT = defineApiRoute({
	input: GEGEinpreisungSchema.omit({
		benutzer_id: true,
		id: true,
		uid: true,
		status: true,
	}).merge(z.object({
		nachweis_uid: UUidWithPrefix
	})),
	headers: authorizationHeaders,
	middleware: authorizationMiddleware,
	async fetch(input, context, user) {
		const ausweisart = getAusweisartFromUUID(input.nachweis_uid);

		let einpreisung;
		if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
			const nachweis = await prisma.gEGNachweisWohnen.findUnique({
				where: {
					uid: input.nachweis_uid
				}
			})

			if (!nachweis || nachweis.benutzer_id !== user.id) {
				throw new APIError({
					code: "BAD_REQUEST",
					message: "Ausweis existiert nicht oder gehört einem anderen Benutzer."
				})
			}


			einpreisung = await prisma.gEGEinpreisung.create({
				data: {
					...omit(input, ["nachweis_uid"]),
					status: Enums.Einpreisungsstatus.open,
					benutzer: {
						connect: {
							id: user.id
						}
					},
					geg_nachweis_wohnen: {
						connect: {
							uid: input.nachweis_uid
						}
					}
				}
			})
		} else {
			throw new APIError({
				"code": "BAD_REQUEST",
				"message": `Ausweisart wird nicht unterstützt: ${ausweisart}`
			})
		}

		

		return {
			uid: einpreisung.uid
		}
	},
})