import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "#lib/client/prisma";
import { prisma } from "#lib/server/prisma";
import { getEmpfehlungen } from "./getEmpfehlungen";

export class AusweisBerechnungen2016 {
	private ausweis: VerbrauchsausweisWohnen;
	private gebaeude: GebaeudeStammdaten;
	private _berechParameter: any;

	public constructor(ausweis: VerbrauchsausweisWohnen, gebaeude: GebaeudeStammdaten, berechnungen: any) {
		this.ausweis          = ausweis;
		this.gebaeude = gebaeude
		this._berechParameter = berechnungen;
	}

	public getAusweisart() {
		switch (this.ausweis.aufnahme.ausweisart.toLowerCase()) {
			case ('va'):
				return {'typ' : 'Wohngebaeude', 'art' : 'Verbrauchsausweis Wohngebäude', 'kuerzel' : 'va'};
			case ('ba'):
				return {'typ' : 'Wohngebaeude', 'art' : 'Bedarfsausweis Wohngebäude', 'kuerzel' : 'ba'};
			case ('vanw'):
				return {
					'typ'     : 'Nichtwohngebaeude',
					'art'     : 'Verbrauchsausweis Nichtwohngebäude',
					'kuerzel' : 'vanw'
				};
		}
	}

	public altersKlasse(art: "baujahr_gebaeude" | "baujahr_heizung") {
		const year = this.gebaeude[art][0] || 0;
		switch (true) {
			case (year <= 1918):
				return 'bis 1918';

			case (year > 1918 && year <= 1948):
				return '1919...1948';

			case (year > 1948 && year <= 1957):
				return '1949...1957';

			case (year > 1957 && year <= 1968):
				return '1958...1968';

			case (year > 1968 && year <= 1978):
				return '1969...1978';

			case (year > 1978 && year <= 1982):
				return '1979...1982';

			case (year > 1982 && year <= 1994):
				return '1983...1994';

			case (year > 1994 && year <= 2002):
				return '1995...2002';

			case (year > 2002 && year <= 2007):
				return '2003...2007';

			case (year > 2007 && year <= 2015):
				return '2008...2015';

			case (year > 2015):
				return 'ab 2016';

			default:
				return '';

		}
	}

	public getGebaeudeTeil() {
		if (this.gebaeude.gebaeudeteil == "Gesamtgebäude") {
			return "Ganzes Gebäude";
		} else if (this.gebaeude.gebaeudeteil == "Wohnen" && this.ausweis.aufnahme.ausweisart == "VANW") {
			return "Teil des Wohngebäudes";
		} else {
			return "Teil des Nichtwohngebäudes";
		}
	}

	public getGebaeudeTyp(getAnbaugrad = false) {

		let geTypes = {
			'Einfamilienhaus'                : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'freistehend'
			},
			'Freistehendes Einfamilienhaus'  : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'freistehend'
			},
			'Freistehendes Zweifamilienhaus' : {
				'typ'       : "Zweifamilienhaus",
				'anbaugrad' : 'freistehend'
			},
			'Doppelhaushälfte'               : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'einseitig angebaut'
			},
			'Reihenendhaus'                  : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'einseitig angebaut'
			},
			'Reihenmittelhaus'               : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'zweiseitig angebaut'
			},
			'Mehrfamilienhaus'               : {
				'typ'       : "Mehrfamilienhaus",
				'anbaugrad' : 'freistehend'
			},
			'Wohn- und Geschäftshaus'        : {
				'typ'       : "Wohnteil gemischt genutztes Gebäude",
				'anbaugrad' : 'zweiseitig angebaut'
			},
			'Stadthausdrittel'               : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'zweiseitig angebaut'
			},
			'Bungalow'                       : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'freistehend'
			},
			'Winkelbungalow'                 : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'freistehend'
			},
			'Atrium-Bungalow'                : {
				'typ'       : "Einfamilienhaus",
				'anbaugrad' : 'freistehend'
			},
			};
		if (getAnbaugrad) {
			return geTypes[this.gebaeude.gebaeudetyp]['anbaugrad'];
		}
		return geTypes[this.gebaeude.gebaeudetyp]['typ'];
	}

	public getEnergietraegerBezeichnung(bezeichnung: string, einheit: string) {
		let bez    = bezeichnung.trim() + einheit.trim();
		let retArr = {
			'Heizöl ELl'           : "Heizöl EL in Liter",
			'Heizöl ELkWh'         : "Heizöl EL in kWh Brennwert",
			'HeizölkWh'            : "Heizöl EL in kWh Brennwert",
			3                      : "Heizöl-Bioöl-Mischung in Liter",
			4                      : "Heizöl-Bioöl-Mischung in kWh Brennwert",
			5                      : "Heizöl-Bioöl-Mischung in kWh Brennwert",
			6                      : "Bioöl in Liter",
			7                      : "Bioöl in kWh Brennwert",
			8                      : "Bioöl in kWh Brennwert",
			'Erdgas Hm³'           : "Erdgas H in m³",
			'Erdgas HkWh'          : "Erdgas H in kWh Brennwert",
			'ErdgaskWh'            : "Erdgas H in kWh Brennwert",
			12                     : "Erdgas-Biogas-Mischung in m³",
			13                     : "Erdgas-Biogas-Mischung in kWh Brennwert",
			14                     : "Erdgas-Biogas-Mischung in kWh Brennwert",
			15                     : "Biogas in m³",
			16                     : "Biogas in kWh Brennwert",
			17                     : "Biogas in kWh Brennwert",
			'Flüssiggasm³'         : "Flüssiggas in m³ gasförmig",
			'Flüssiggasl'          : "Flüssiggas in Liter flüssig",
			'Flüssiggaskg'         : "Flüssiggas in kg",
			'FlüssiggaskWh'        : "Flüssiggas in kWh Brennwert",
			22                     : "Flüssiggas in kWh Brennwert",
			23                     : "Steinkohle in kg",
			24                     : "Steinkohle in kWh Brennwert",
			'Kokskg'               : "Koks in kg",
			'KokskWh'              : "Koks in kWh Brennwert",
			'Braunkohlekg'         : "Braunkohle in kg",
			'BraunkohlekWh'        : "Braunkohle in kWh Brennwert",
			'Brennholzm³'          : "Holz in Raummeter",
			'BrennholzSRm'         : "Holz in Schüttraummeter",
			'Brennholzkg'          : "Holz in kg",
			'BrennholzkWh'         : "Holz in kWh Brennwert",
			32                     : "Holz in kWh Brennwert",
			'HolzhackschnitzelSRm' : "Holz in Schüttraummeter",
			'Holzhackschnitzelkg'  : "Holz in kg",
			'HolzhackschnitzelkWh' : "Holz in kWh Brennwert",
			36                     : "Holz in kWh Brennwert",
			'Holz-PelletsSRm'      : "Holz in Schüttraummeter",
			'Holz-Pelletskg'       : "Holz in kg",
			'Holz-PelletskWh'      : "Holz in kWh Brennwert",
			40                     : "Holz in kWh Brennwert",
			41                     : "Wärme aus lokalem BHKW in kWh",
			'Nahwärme HKW FBkWh'   : "Nah-/Fernwärme aus Heizwerken - fossiler Brennstoff in kWh",
			'Fernwärme HKW FBkWh'  : "Nah-/Fernwärme aus Heizwerken - fossiler Brennstoff in kWh",
			'StrommixkWh'          : "allgemeiner Strommix in kWh",
			'Erdgas LkWh'          : "Erdgas H in kWh Brennwert",
			'Erdgas Lm³'           : "Erdgas H in m³",
			'Erdgasm³'             : "Erdgas H in m³",
			'Heizöll'              : "Heizöl EL in Liter",
			'Nahwärme HKW EBkWh'   : "Nah-/Fernwärme aus Heizwerken - erneuerbarer Brennstoff in kWh",
			'Fernwärme HKW EBkWh'  : "Nah-/Fernwärme aus Heizwerken - erneuerbarer Brennstoff in kWh",
			'Nahwärme KWK EBkWh'   : "Nah-/Fernwärme aus KWK - erneuerbarer Brennstoff in kWh",
			'Fernwärme KWK EBkWh'  : "Nah-/Fernwärme aus KWK - erneuerbarer Brennstoff in kWh",
			'Nahwärme KWK FBkWh'   : "Nah-/Fernwärme aus KWK - fossiler Brennstoff in kWh",
			'Fernwärme KWK FBkWh'  : "Nah-/Fernwärme aus KWK - fossiler Brennstoff in kWh"

		};

		return retArr[bez];
	}


	public getEmpfehlungen() {
		let empfehlungen = getEmpfehlungen(this.ausweis, this.gebaeude);

		if (empfehlungen.length > 0) {
			return 'http://www.bbsr-energieeinsparung.de/EnEVPortal/DE/Home/home_node.html';
		} else {
			return 'Angabe hier nicht relevant';
		}
	}

	public getLueftungsKonzept() {
		let lueftungsKonzept: Record<string, string> = {}
		lueftungsKonzept['fensterlueftung'] = (this.gebaeude.lueftung == "Fensterlüftung")
			? "true" : "false";

		lueftungsKonzept['schachtlueftung'] = (this.gebaeude.lueftung == "Schachtlüftung")
			? "true" : "false";

		lueftungsKonzept['ohneRueckgewinnung'] = (this.gebaeude.lueftung
			== "Lüftungsanlage ohne Wärmerückgewinnung") ? "true" : "false";

		lueftungsKonzept['mitRueckgewinnung'] = (this.gebaeude.lueftung
			== "Lüftungsanlage mit Wärmerückgewinnung") ? "true" : "false";

		return lueftungsKonzept;
	}

	public kellerBeheizt() {
		return this.ausweis.keller_beheizt ? "true" : "false";
	}

	public anlass() {

		let anlass = '';

		if (this.ausweis.ausstellgrund == "Neubau") {
			anlass = 'Neubau';
		} else if (this.ausweis.ausstellgrund == "Modernisierung") {
			anlass = 'Modernisierung-Erweiterung';
		} else if (this.ausweis.ausstellgrund == "Vermietung") {
			anlass = 'Vermietung-Verkauf';
		} else if (this.ausweis.ausstellgrund == "Aushang") {
			anlass = 'Aushangpflicht';
		} else {
			anlass = 'Sonstiges';
		}

		return anlass;

	}

	public async getOrt() {
		if (!this.gebaeude.plz) {
			return ""
		}

		const result = await prisma.postleitzahlen.findUnique({
			where: {
				plz: this.gebaeude.plz
			}
		})

		return result?.bundesland || "";
	}

	public getBerechAusweis() {

		return this._berechParameter;
	}

	/**
	 * function to check if several values are filled
	 */
	public emptyParams() {
		let emptyParams: Record<string, string> = {};
		emptyParams['wirdGekuehlt'] = this.ausweis.wird_gekuehlt ? 'true' : 'false';

		emptyParams['datenErhebungEigentuemer'] = "true";

		emptyParams['datenErhebungAussteller'] = "false";

		emptyParams['nwheizung']     = this.gebaeude.zentralheizung
			? 'true' : 'false';
		emptyParams['nwwarmwasser']  = this.gebaeude.einzelofen
			? 'true' : 'false';
		emptyParams['nwlueftung']    = this.gebaeude.durchlauf_erhitzer
			? 'true' : 'false';
		emptyParams['nwbeleuchtung'] = this.gebaeude.standard_kessel
			? 'true' : 'false';
		emptyParams['nwkuehlung']    = this.gebaeude.solarsystem_warmwasser
			? 'true' : 'false';
		//emptyParams['nwsonstiges']   = this.gebaeude.nwsonstiges
		//	? 'true' : 'false';

		return emptyParams;
	}


	public getBauEmpfehlungen() {
		let empfehlungen = getEmpfehlungen(this.ausweis, this.gebaeude);

		return empfehlungen.map(empfehlung => {
			return {
				"anlagenteil" : empfehlung["anlagenteil"],
				"massnahme"   : empfehlung["description"]
			}
		})
	}




	public getEnergieEffizienzklasse() {

		let param = this._berechParameter.endEnergieVerbrauchGesamt;

		if (param < 30) {
			return 'A+';
		}else if (param < 50) {
			return 'A';
		}else if (param < 75) {
			return 'B';
		}else if (param < 100) {
			return 'C';
		}else if (param < 130) {
			return 'D';
		}else if (param < 160) {
			return 'E';
		}else if (param < 200) {
			return 'F';
		}else if (param < 250) {
			return 'G';
		}else if (param >= 250) {
			return 'H';
}	
		return this._berechParameter.endEnergieVerbrauchGesamt;
	}

	public getAusweisParameter() {
		return this.ausweis;
	}
}