import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
import { fileURLToPath } from "url";
import { writeFileSync } from "fs";
import { PERSISTENT_DIR } from "#lib/server/constants.js";
import { UnterlageSchema } from "src/generated/zod/unterlage.js";

export const PUT = defineApiRoute({
	input: UnterlageSchema.omit({
		aufnahme_id: true,
		id: true,
		uid: true
	}).merge(z.object({
		data: z.string(),
	})),
	output: z.object({
		uid: z.string({ description: "Die UID der Unterlage." })
	}),
	async fetch({ data, name, kategorie, mime }, ctx, user) {
		if (mime !== "application/pdf" && mime !== "image/png" && mime !== "image/jpeg") {
			throw new APIError({
				code: "BAD_REQUEST",
				message: "Nicht unterstützter mimetype, unterstützt werden 'image/jpeg', 'image/png', 'application/pdf'."
			})
		}

		const buffer = Buffer.from(data, "base64");

		const unterlage = await prisma.unterlage.create({
			data: {
				kategorie: kategorie,
				mime,
				name
			},
			select: {
				uid: true,
			},
		});

		const filePath = fileURLToPath(new URL(`${PERSISTENT_DIR}/unterlagen/${unterlage.uid}`, import.meta.url));

		try {
			writeFileSync(filePath, buffer)
		} catch(e) {
			// Unterlage wurde nicht gespeichert, wir löschen den Eintrag wieder
			await prisma.unterlage.delete({
				where: {
					uid: unterlage.uid
				}
			})
			// Und geben einen Fehler zurück
			throw new APIError({
				code: "UNPROCESSABLE_CONTENT",
				message: "Unterlage konnte nicht gespeichert werden.",
			});
		}

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

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

		const objekt = await prisma.aufnahme.findUnique({
			where: {
				uid,
				benutzer_id: user.id
			},
			select: {
				benutzer_id: true,
				unterlagen: {
					select: {
						kategorie: true,
						uid: true
					}
				}
			}
		})

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

		return objekt.unterlagen
	},
})