import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { hashPassword } from "#lib/password.js";
import { sendRegisterMail } from "#lib/server/mail/registrierung.js";
import { BenutzerSchema, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";

export const POST = defineApiRoute({
	input: BenutzerSchema.omit({
		id: true,
		lex_office_id: true,
		uid: true,
		rolle: true
	}),
	middleware: authorizationMiddleware,
	async fetch(input, context, user) {
		if (user.email !== input.email) {
			// TODO: Email wurde geändert, neue Bestätigunsmail schicken.
		}

		await prisma.benutzer.update({
			where: {
				id: user.id
			},
			data: {
				adresse: input.adresse,
				anrede: input.anrede,
				email: input.email,
				firma: input.firma,
				name: input.name,
				vorname: input.vorname,
				ort: input.ort,
				passwort: hashPassword(input.passwort),
				plz: input.plz,
				profilbild: input.profilbild,
				telefon: input.telefon,
			}
		})
	},
})

export const PUT = defineApiRoute({
	input: z.object({
		email: z.string().email(),
		passwort: z.string().min(8),
		vorname: z.string(),
		name: z.string()
	}),
	output: z.object({
		uid: UUidWithPrefix
	}),
	async fetch(input) {
		const existingUser = await prisma.benutzer.findUnique({
			where: {
				email: input.email
			}
		})

		if (existingUser) {
			throw new APIError({
				code: "CONFLICT",
				message: "Email Adresse ist bereits vergeben."
			})
		}

		const user = await prisma.benutzer.create({
			data: {
				email: input.email,
				passwort: hashPassword(input.passwort),
				vorname: input.vorname,
				name: input.name
			}
		})

		await sendRegisterMail(user)

		return { uid: user.uid }
	},
})