import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, UUidWithPrefix, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { filterAusweise } from "#lib/filters.js";
import { omit } from "#lib/helpers.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, prisma } from "#lib/server/prisma.js";
import { defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";

export const GET = defineApiRoute({
	middleware: authorizationMiddleware,
	headers: authorizationHeaders,
	input: z.object({
		filters: filterAusweise.optional(),
		limit: z.number().optional(),
		skip: z.number().optional()
	}),
	async fetch(input, context, user) {
		if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
			input.filters = input.filters || {}
			input.filters["benutzer"] = {
				uid: user.uid
			}
		}

		const ausweise = await prisma.verbrauchsausweisWohnen.findMany({
			where: {
				...input.filters
			},
			include: {
				aufnahme: {
					include: {
						objekt: true,
						bilder: true,
						events: true
					}
				}
			},
			skip: input.skip || 0,
			take: Math.min(input.limit || 50, 50)
		})

		return ausweise.map(ausweis => ({
			ausweis: omit(ausweis, ["aufnahme"]) as VerbrauchsausweisWohnenClient,
			aufnahme: omit(omit(ausweis.aufnahme, ["events"]), ["objekt"]) as AufnahmeClient,
			objekt: omit(ausweis.aufnahme.objekt, ["bilder"]) as ObjektClient,
			bilder: ausweis.aufnahme.bilder as unknown as UploadedGebaeudeBild[],
			events: ausweis.aufnahme.events
		}))
	},
})