import {
	BenutzerClient,
	GebaeudeAufnahmeClient,
	GebaeudeClient,
	UploadedGebaeudeBild,
	VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types";

import { exclude } from "#lib/exclude";
import { client } from "src/trpc";
import { bilderHochladen } from "./bilderHochladen";
import { addNotification } from "@ibcornelsen/ui";

export async function verbrauchsausweisWohnenSpeichern(
	ausweis: VerbrauchsausweisWohnenClient,
	gebaeude: GebaeudeClient,
	gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient,
	images: (UploadedGebaeudeBild & { base64?: string })[],
	user: BenutzerClient
) {
	if (ausweis.uid) {
		// Anscheinend wurde der Ausweis bereits erstellt und hat eine UID.
		// Jetzt müssen wir ihn nun nur noch abspeichern.
		try {
			await client.v1.verbrauchsausweisWohnen[2016].speichern.mutate({
				...ausweis,
				gebaeude_aufnahme_allgemein: {
					...exclude(
						gebaeude_aufnahme_allgemein,
						["erstellungsdatum", "events", "ausstellungsdatum", "rechnungen"]
					),
					gebaeude_stammdaten: {
						...exclude(gebaeude, [
							"gebaeude_bilder",
						]),
					},
				},
			});

			images = await bilderHochladen(images, gebaeude.uid);

			return  { uid: ausweis.uid, gebaeude_uid: gebaeude.uid, gebaeude_aufnahme_uid: gebaeude_aufnahme_allgemein.uid };
		} catch (e) {
			// TODO: Ticket mit Fehldermeldung abschicken.
		}
	} else {
		// Wir speichern den Ausweis ab und leiten auf die "ausweis-gespeichert" Seite weiter.
		try {
			const response =
				await client.v1.verbrauchsausweisWohnen[2016].erstellen.mutate({
					...ausweis,
					gebaeude_aufnahme_allgemein: {
						...gebaeude_aufnahme_allgemein,
						gebaeude_stammdaten: {
							...gebaeude,
						},
					},
				});

			images = await bilderHochladen(images, response.gebaeude_uid);

			return response;
		} catch (e: any) {
			await client.v1.tickets.erstellen.mutate({
				titel: "Ausweis konnte nicht gespeichert werden",
				beschreibung: e.stack,
				email: user.email ?? "",
				metadata: JSON.stringify({
					ausweis,
				}),
			});
			// TODO: Ticket mit Fehldermeldung abschicken.
		}
	}

	addNotification({
		dismissable: false,
		message:
			"Ausweis konnte nicht gespeichert werden, bitte versuchen sie es erneut.",
		subtext:
			"Sollte das Problem weiterhin bestehen, kontaktieren sie bitte den Support.",
		timeout: 6000,
		type: "error",
	});
	return null;
}
