import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { adminMiddleware } from "#lib/middleware/authorization.js";
import { mollieClient } from "#lib/mollie.js";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
import { Prisma, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";

export const PUT = defineApiRoute({
	input: z.object({
		uid_ausweis: UUidWithPrefix
	}),
	middleware: adminMiddleware,
	async fetch(input, context, transfer) {
		const adapter = getPrismaAusweisAdapter(input.uid_ausweis) as Prisma.VerbrauchsausweisWohnenDelegate;

		if (!adapter) {
			throw new APIError({
				code: "BAD_REQUEST",
				message: "Ungültige 'uid_ausweis'"
			})
		}

		const ausweis = await adapter.findUnique({
			where: {
				uid: input.uid_ausweis
			}
		})

		if (!ausweis) {
			throw new APIError({
				code: "NOT_FOUND",
				message: "Ausweis konnte nicht gefunden werden."
			})
		}

		const response = await adapter.findUnique({
			where: {
				uid: input.uid_ausweis
			},
			select: {
				rechnung: true
			}
		})

		if (!response || !response.rechnung) {
			await adapter.update({
				where: {
					uid: input.uid_ausweis
				},
				data: {
					storniert: true
				}
			})

			throw new APIError({
				code: "NOT_FOUND",
				message: "Rechnung konnte nicht gefunden werden aber Ausweis wurde storniert."
			})
		}

		const rechnung = response.rechnung;

		await adapter.update({
			where: {
				uid: input.uid_ausweis
			},
			data: {
				storniert: true,
				rechnung: {
					update: {
						status: "canceled",
						storniert_am: new Date()
					}
				}
			},
			select: {
				rechnung: {
					select: {
						betrag: true,
						bezahlmethode: true,
						status: true
					}
				}
			}
		})

		if (rechnung.betrag > 0 && rechnung.bezahlmethode !== "rechnung" && rechnung.status === "paid" && rechnung.transaktions_referenz) {
			const refund = await mollieClient.paymentRefunds.create({
				description: "Rückerstattung IBCornelsen",
				paymentId: rechnung.transaktions_referenz,
				amount: {
					currency: "EUR",
					value: rechnung.betrag.toFixed(2)
				},
				metadata: {
					rechnung_uid: rechnung.uid
				},
				testmode: true
			})
		}
	},
})