<script lang="ts">
	import { BenutzerClient, GebaeudeClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
	import { addNotification, updateNotification } from "@ibcornelsen/ui";
	import { validateAccessTokenClient } from "../../client/lib/validateAccessToken";
	import { client } from "src/trpc";
	import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
	import Overlay from "#components/Overlay.svelte";

	export let gebaeude: GebaeudeClient;
	export let images: UploadedGebaeudeBild[];
	export let ausweis: VerbrauchsausweisWohnenClient;
	export let user: BenutzerClient;

	async function bilderHochladen() {
		// Alle Bilder hochladen
		const notification = addNotification({
			dismissable: false,
			message: "Bilder hochladen.",
			subtext: `${images.length} Bilder werden hochgeladen, bitte haben sie Geduld.`,
			timeout: 0,
			type: "info"
		})
		for (let i = 0; i < images.length; i++) {
			const image = images[i];
			if (image.uid) {
				// Bild wurde bereits hochgeladen, wir müssen es also nicht nochmal hochladen.
				continue
			}

			try {
				const response = await client.v1.bilder.upload.mutate({
					base64: image.base64,
					kategorie: image.kategorie,
					gebaeude_uid: gebaeude.uid
				})

				image.uid = response.uid

				updateNotification(notification, {
					dismissable: true,
					message: "Bild hochgeladen.",
					subtext: `${i + 1}/${images.length} Bildern wurden erfolgreich hochgeladen, bitte haben sie Geduld.`,
					timeout: 4000
				})
			} catch (e) {
				updateNotification(notification, {
					dismissable: true,
					message: "Bild konnte nicht hochgeladen werden.",
					subtext: `Bild ${i + 1}/${images.length} konnte nicht hochgeladen werden, wir haben bereits ein Ticket erstellt und melden uns so schnell wie möglich bei ihnen.`,
					timeout: 150000,
					type: "error"
				})
			}
		}
	}

	async function ausweisSpeichern() {
		// Um einen Ausweis zu speichern müssen wir eingeloggt sein, andernfalls wird die API den call ablehnen.
		// Wir prüfen also ob wir eingeloggt sind und leiten den Nutzer ggf. auf die Login Seite weiter.
		if (!await validateAccessTokenClient()) {
			loginOverlayHidden = false;
			return
		}

		loginOverlayHidden = true;

		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
				})

				await bilderHochladen();

				return true;
			} 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
				})
				ausweis.uid = response.uid;
				gebaeude.uid = response.gebaeude_uid;

				await bilderHochladen();

				return true;
			} 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,
						gebaeude
					})
				})
				// 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 false
	}

	async function ausweisAbschicken(e: SubmitEvent) {
		e.preventDefault()
		const result = await ausweisSpeichern();

		if (result === true) {
			window.location.href = `/kundendaten?uid=${ausweis.uid}`;
		}
	}

	let loginOverlayHidden = true;
</script>

<Overlay bind:hidden={loginOverlayHidden}>
	<div class="bg-white w-full max-w-screen-sm py-8">
		<EmbeddedAuthFlowModule onLogin={ausweisAbschicken}></EmbeddedAuthFlowModule>
	</div>
</Overlay>

<button type="submit" class="button">Weiter</button>