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

export const GET = defineApiRoute({
	input: z.object({
		plz: z.string().min(1).max(5),
		limit: z.number().int().max(50).min(1).default(10).optional(),
	}),
	output: z.array(
		z.object({
			plz: z.string().min(4).max(5),
			stadt: z.string(),
			bundesland: z.string(),
			landkreis: z.string(),
			lat: z.number(),
			lon: z.number(),
		})
	),
	async fetch(input, context) {
		const plz = input.plz;

		const postleitzahlen = await prisma.postleitzahlen.findMany({
			where: {
				plz: {
					startsWith: plz,
				},
			},
			take: input.limit,
			select: {
				plz: true,
				stadt: true,
				bundesland: true,
				landkreis: true,
				lat: true,
				lon: true,
			},
		});

		if (postleitzahlen.length === 0) {
			throw new APIError({
				code: "NOT_FOUND",
				message: "Postleitzahl nicht gefunden",
			});
		}

		return postleitzahlen;
	},
});
