/**
 * Der Webhook wird von Mollie ausgelöst, wenn sich der Status einer Transaktion ändert.
 * https://docs.mollie.com/overview/webhooks
 * @param _props { id: string }
 */

import { z } from "zod";
import { Enums, prisma } from "#lib/server/prisma";
import { mollieClient } from "#lib/mollie.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";

export const POST = defineApiRoute({
	input: z.object({
		id: z.string(),
	}),
	output: z.void(),
	async fetch(input, ctx) {
		const { id } = input;

		// Wir holen uns die Transaktion von Mollie.
		const payment = await mollieClient.payments.get(id);
		const metadata = payment.metadata as { rechnung_uid: string }

		if (!payment) {
			throw new APIError({
				code: "NOT_FOUND",
				message: "Transaktion nicht gefunden.",
			});
		}

		if (!metadata.rechnung_uid) {
			throw new APIError({
				code: "BAD_REQUEST",
				message: "Rechnung UID nicht gefunden.",
			});
		}

		// Wir holen uns die Rechnung aus unserer Datenbank.
		const rechnung = await prisma.rechnung.findUnique({
			where: {
				uid: metadata.rechnung_uid,
			},
		});

		if (!rechnung) {
			throw new APIError({
				code: "NOT_FOUND",
				message: "Rechnung nicht gefunden.",
			});
		}

		// Wir aktualisieren den Status der Rechnung.
		await prisma.rechnung.update({
			where: {
				id: rechnung.id,
			},
			data: {
				status: payment.status as Enums.Rechnungsstatus,
				transaktions_referenz: payment.id,
			},
		});
	},
});
