import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { BildSchema } from "src/generated/zod/bild.js";

export const PUT = defineApiRoute({
	input: z.array(UUidWithPrefix),
	output: z.void(),
	middleware: authorizationMiddleware,
	async fetch(input, ctx, user) {
		const aufnahme = await prisma.aufnahme.findUnique({
			where: {
				uid: ctx.params.uid
			}
		})

		if (!aufnahme) {
			throw new APIError({
				code: "NOT_FOUND",
				message: "Aufnahme existiert nicht oder gehört einem anderen Benutzer."
			})
		}

		prisma.$transaction(async tx => {
			for (const uid of input) {
				const img = await tx.bild.update({
					where: {
						uid,
						aufnahme_id: null
					},
					data: {
						aufnahme_id: aufnahme.id
					},
					select: {
						uid: true
					}
				})
	
				if (!img) {
					throw new APIError({
						code: "NOT_FOUND",
						message: "Bild existiert nicht oder gehört bereits zu einer anderen Aufnahme."
					})
				}
			}
		})
	},
})

export const GET = defineApiRoute({
	middleware: authorizationMiddleware,
	output: z.array(BildSchema.pick({
		kategorie: true,
		uid: true
	})),
	async fetch(input, ctx, user) {
		const { uid } = ctx.params;

		const aufnahme = await prisma.aufnahme.findUnique({
			where: user.rolle === Enums.BenutzerRolle.USER ? {
				uid,
				benutzer_id: user.id
			} : { uid },
			select: {
				benutzer_id: true,
				bilder: {
					select: {
						kategorie: true,
						uid: true
					}
				}
			}
		})

		if (!aufnahme) {
			throw new APIError({
				code: "NOT_FOUND",
				message: "Aufnahme existiert nicht oder gehört einem anderen Benutzer."
			})
		}

		return aufnahme.bilder
	},
})