
import { api } from "astro-typesafe-api/client"
import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BildClient, ObjektClient, UnterlageClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient,  } from "#components/Ausweis/types.js";
import { Enums } from "#lib/client/prisma.js";

export async function nachweisSpeichern(
	nachweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,
	objekt: ObjektClient,
	aufnahme: AufnahmeClient,
	bilder: BildClient[],
	unterlagen: UnterlageClient[],
	ausweisart: Enums.Ausweisart
) {
	if (objekt.uid) {
		await api.objekt._uid.PATCH.fetch({
			adresse: objekt.adresse,
			latitude: 0,
			longitude: 0,
			ort: objekt.ort,
			plz: objekt.plz
		}, {
			params: {
				uid: objekt.uid
			},
			headers: {
				"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
			}
		})
} else {
		const { uid } = await api.objekt.PUT.fetch({
			adresse: objekt.adresse,
			latitude: 0,
			longitude: 0,
			ort: objekt.ort,
			plz: objekt.plz
		}, {
			headers: {
				"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
			}
		})

		objekt.uid = uid;
	}



	if (aufnahme.uid) {
		await api.aufnahme._uid.PATCH.fetch({
			baujahr_gebaeude: aufnahme.baujahr_gebaeude || [],
			baujahr_heizung: aufnahme.baujahr_heizung || [],
			baujahr_klima: aufnahme.baujahr_klima || [],
			alternative_heizung: aufnahme.alternative_heizung,
			alternative_kuehlung: aufnahme.alternative_kuehlung,
			alternative_lueftung: aufnahme.alternative_lueftung,
			alternative_warmwasser: aufnahme.alternative_warmwasser,
			aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
			aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
			ausweisart: aufnahme.ausweisart,
			brennstoff_1: aufnahme.brennstoff_1,
			brennstoff_2: aufnahme.brennstoff_2,
			brennwert_kessel: aufnahme.brennwert_kessel,
			dachgeschoss: aufnahme.dachgeschoss,
			dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
			dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt,
			doppel_verglasung: aufnahme.doppel_verglasung,
			dreifach_verglasung: aufnahme.dreifach_verglasung,
			durchlauf_erhitzer: aufnahme.durchlauf_erhitzer,
			einfach_verglasung: aufnahme.einfach_verglasung,
			einheiten: aufnahme.einheiten,
			einzelofen: aufnahme.einzelofen,
			energieeffizienzklasse: aufnahme.energieeffizienzklasse,
			fenster_dicht: aufnahme.fenster_dicht,
			fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
			flaeche: aufnahme.flaeche,
			gebaeudeteil: aufnahme.gebaeudeteil,
			gebaeudetyp: aufnahme.gebaeudetyp,
			heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt,
			isolier_verglasung: aufnahme.isolier_verglasung,
			keller: aufnahme.keller,
			keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt,
			keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt,
			kuehlung: aufnahme.kuehlung,
			leerstand: aufnahme.leerstand,
			lueftung: aufnahme.lueftung,
			niedertemperatur_kessel: aufnahme.niedertemperatur_kessel,
			nutzflaeche: aufnahme.nutzflaeche,
			oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt,
			oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt,
			photovoltaik: aufnahme.photovoltaik,
			raum_temperatur_regler: aufnahme.raum_temperatur_regler,
			rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt,
			saniert: aufnahme.saniert,
			solarsystem_warmwasser: aufnahme.solarsystem_warmwasser,
			standard_kessel: aufnahme.standard_kessel,
			tueren_dicht: aufnahme.tueren_dicht,
			tueren_undicht: aufnahme.tueren_undicht,
			waermepumpe: aufnahme.waermepumpe,
			warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt,
			zentralheizung: aufnahme.zentralheizung,
			zirkulation: aufnahme.zirkulation
		}, {
			params: {
				uid: aufnahme.uid
			},
			headers: {
				"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
			}
		})
	} else {
		const { uid } = await api.aufnahme.PUT.fetch({
			aufnahme: {
				baujahr_gebaeude: aufnahme.baujahr_gebaeude,
				baujahr_heizung: aufnahme.baujahr_heizung,
				alternative_heizung: aufnahme.alternative_heizung,
				alternative_kuehlung: aufnahme.alternative_kuehlung,
				alternative_lueftung: aufnahme.alternative_lueftung,
				alternative_warmwasser: aufnahme.alternative_warmwasser,
				aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
				aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
				ausweisart: aufnahme.ausweisart,
				baujahr_klima: aufnahme.baujahr_klima,
				brennstoff_1: aufnahme.brennstoff_1,
				brennstoff_2: aufnahme.brennstoff_2,
				brennwert_kessel: aufnahme.brennwert_kessel,
				dachgeschoss: aufnahme.dachgeschoss,
				dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
				dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt,
				doppel_verglasung: aufnahme.doppel_verglasung,
				dreifach_verglasung: aufnahme.dreifach_verglasung,
				durchlauf_erhitzer: aufnahme.durchlauf_erhitzer,
				einfach_verglasung: aufnahme.einfach_verglasung,
				einheiten: aufnahme.einheiten,
				einzelofen: aufnahme.einzelofen,
				energieeffizienzklasse: aufnahme.energieeffizienzklasse,
				erstellungsdatum: aufnahme.erstellungsdatum,
				fenster_dicht: aufnahme.fenster_dicht,
				fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
				flaeche: aufnahme.flaeche,
				gebaeudeteil: aufnahme.gebaeudeteil,
				gebaeudetyp: aufnahme.gebaeudetyp,
				heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt,
				isolier_verglasung: aufnahme.isolier_verglasung,
				keller: aufnahme.keller,
				keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt,
				keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt,
				kuehlung: aufnahme.kuehlung,
				leerstand: aufnahme.leerstand,
				lueftung: aufnahme.lueftung,
				niedertemperatur_kessel: aufnahme.niedertemperatur_kessel,
				nutzflaeche: aufnahme.nutzflaeche,
				oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt,
				oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt,
				photovoltaik: aufnahme.photovoltaik,
				raum_temperatur_regler: aufnahme.raum_temperatur_regler,
				rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt,
				saniert: aufnahme.saniert,
				solarsystem_warmwasser: aufnahme.solarsystem_warmwasser,
				standard_kessel: aufnahme.standard_kessel,
				tueren_dicht: aufnahme.tueren_dicht,
				tueren_undicht: aufnahme.tueren_undicht,
				waermepumpe: aufnahme.waermepumpe,
				warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt,
				zentralheizung: aufnahme.zentralheizung,
				zirkulation: aufnahme.zirkulation
			},
			uid_objekt: objekt.uid
		}, {
			headers: {
				"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
			}
		})

		aufnahme.uid = uid
	}

	let patchRoute: any;
	let putRoute: any;
	if (ausweisart == Enums.Ausweisart.GEGNachweisWohnen) {
		patchRoute = api["geg-nachweis-wohnen"]._uid.PATCH
		putRoute = api["geg-nachweis-wohnen"].PUT
	} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
		patchRoute = api["geg-nachweis-gewerbe"]._uid.PATCH
		putRoute = api["geg-nachweis-gewerbe"].PUT
	} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
		patchRoute = api["bedarfsausweis-gewerbe"]._uid.PATCH
		putRoute = api["bedarfsausweis-gewerbe"].PUT
	}

	if (nachweis.uid) {
		await patchRoute.fetch({
			...exclude(nachweis, ["uid"])
		}, {
			params: {
				uid: nachweis.uid
			},
			headers: {
				"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
			}
		})
	} else {
		const { uid } = await putRoute.fetch({
			nachweis,
			uid_aufnahme: aufnahme.uid
		}, {
			headers: {
				"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
			}
		})

		nachweis.uid = uid;
	}

	await api.aufnahme._uid.bilder.PUT.fetch(bilder.map(bild => bild.uid), {
		params: {
			uid: aufnahme.uid
		},
		headers: {
			"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
		}
	})
	
	return {
		uid_nachweis: nachweis.uid,
		uid_aufnahme: aufnahme.uid,
		uid_objekt: objekt.uid
	}
}
