import { GebaeudeClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { Enums } from "@ibcornelsen/database/client";
import { addNotification, updateNotification } from "@ibcornelsen/ui";
import { client } from "src/trpc";

export async function bilderHochladen(images: (UploadedGebaeudeBild & { base64?: string })[], gebaeude_uid: string) {
	if (images.length == 0) {
		return images;
	}

	// Wenn Bilder hochgeladen werden konvertieren wir sie zu base64, das heißt, dass die base64 Eigenschaft bei diesen Bildern
	// existiert. Das müssen wir TypeScript nur wissen lassen, damit es uns in Ruhe lässt.
	const imagesToUpload = images.filter(image => !image.uid || image.update) as unknown as { base64: string, kategorie: string, uid?: string, update: boolean }[];

	if (imagesToUpload.length == 0) {
		return images;
	}

	// Alle Bilder hochladen
	const notification = addNotification({
		dismissable: false,
		message: "Bilder hochladen.",
		subtext: `${imagesToUpload.length} Bilder werden hochgeladen, bitte haben sie Geduld.`,
		timeout: 0,
		type: "info"
	})
	for (let i = 0; i < imagesToUpload.length; i++) {
		const image = imagesToUpload[i];

		try {
			if (image.update) {
				await client.v1.bilder.update.mutate({
					uid: image.uid as string,
					base64: image.base64,
					kategorie: image.kategorie as Enums.BilderKategorie
				})
			} else {
				const response = await client.v1.bilder.upload.mutate({
					base64: image.base64,
					kategorie: image.kategorie as Enums.BilderKategorie,
					gebaeude_uid
				})
	
				image.uid = response.uid
			}

			updateNotification(notification, {
				dismissable: true,
				message: "Bild hochgeladen.",
				subtext: `${i + 1}/${imagesToUpload.length} Bildern wurden erfolgreich hochgeladen.`,
				timeout: 3000
			})
		} catch (e) {
			updateNotification(notification, {
				dismissable: true,
				message: "Bild konnte nicht hochgeladen werden.",
				subtext: `Eines ihrer Bilder konnte nicht hochgeladen werden. Wir haben bereits ein Ticket erstellt und melden uns so schnell wie möglich bei ihnen.`,
				timeout: 15000,
				type: "error"
			})
		}
	}

	return images;
}