import {
	endEnergieVerbrauchVerbrauchsausweis_2016,
	energetischeNutzflaecheVerbrauchsausweisWohnen_2016,
} from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
import { getKlimafaktoren } from "#lib/Klimafaktoren";
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor";
import {
	GebaeudeStammdaten,
	VerbrauchsausweisWohnen,
} from "#lib/client/prisma";
import { prisma } from "#lib/server/prisma";
import { AusweisBerechnungen2016 } from "../AusweisBerechnungen2016";
import moment from "moment";

export async function xmlVerbrauchsausweisWohnen_2016(
	ausweis: VerbrauchsausweisWohnen & {
		objekt: GebaeudeStammdaten;
	}
): Promise<string> {
	const gebaeude = ausweis.objekt;

	const bundesland = await prisma.postleitzahlen.findUnique({
		where: {
			plz: gebaeude.plz as string,
		},
	});
	// Wir müssen die Postleitzahl unkenntlich machen.
	let postleitzahl = gebaeude.plz?.substring(0, 3) + "XX";

	const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis);

	if (!result) {
		throw new Error("Verbrauchsausweis konnte nicht zur Berechnung verarbeitet werden.");
	}

	const berechnungen = new AusweisBerechnungen2016(
		ausweis,
		ausweis.objekt,
		result
	);
	const klimafaktoren = await getKlimafaktoren(
		ausweis.startdatum,
		gebaeude.plz
	);

	// Berechnungen
	let bauAltersKlasseAnlage = berechnungen.altersKlasse("baujahr_heizung");
	let bauAltersKlasseGebaeude = berechnungen.altersKlasse("baujahr_gebaeude");

	let kellerBeheizt = ausweis.keller_beheizt ? "true" : "false";

	let Zeitraum1von = moment(ausweis.startdatum);
	let Zeitraum1bis = Zeitraum1von.clone()
		.add("12", "month")
		.format("YYYY-MM-DD");
	let Zeitraum2von = Zeitraum1von.clone()
		.add("12", "month")
		.add("1", "day")
		.format("YYYY-MM-DD");
	let Zeitraum2bis = Zeitraum1von.clone()
		.add("24", "month")
		.format("YYYY-MM-DD");
	let Zeitraum3von = Zeitraum1von.clone()
		.add("24", "month")
		.add("1", "day")
		.format("YYYY-MM-DD");
	let Zeitraum3bis = Zeitraum1von.clone()
		.add("36", "month")
		.format("YYYY-MM-DD");

	let lueftungsKonzept = berechnungen.getLueftungsKonzept();
	let gebaeudeTyp = berechnungen.getGebaeudeTyp();

	let erstellungsdatum = moment(ausweis.erstellungsdatum).format(
		"YYYY-MM-DD"
	);

	let empfehlungen = berechnungen.getBauEmpfehlungen();
	let empfehlungenMoeglich = empfehlungen.length > 0 ? "true" : "false";
	let energieeffizienzKlasse = berechnungen.getEnergieEffizienzklasse();

	let keineNutzungWarmwasser = ausweis.warmwasser_enthalten
		? "false"
		: "true";

	let heizwertfaktor_1 = getHeizwertfaktor(
		ausweis.brennstoff_1 as string,
		ausweis.einheit_1 as string
	);
	let heizwertfaktor_2 = getHeizwertfaktor(
		ausweis.brennstoff_2 as string,
		ausweis.einheit_2 as string
	);

	let warmWasserErmittlung =
		(ausweis.anteil_warmwasser_1 || 0) > 0
			? "direkter Messwert Wärmemenge"
			: "Rechenwert nach Heizkostenverordnung (Wohngebäude)";
	let warmWasserErmittlung_2 =
		(ausweis.anteil_warmwasser_2 || 0) > 0
			? "direkter Messwert Wärmemenge"
			: "Rechenwert nach Heizkostenverordnung (Wohngebäude)";
	if (!ausweis.warmwasser_enthalten) {
		warmWasserErmittlung =
			"Pauschale für dezentrale Warmwasserbereitung (Wohngebäude)";
		warmWasserErmittlung_2 =
			"Pauschale für dezentrale Warmwasserbereitung (Wohngebäude)";
	}

	let anlageKuehlung = ausweis.wird_gekuehlt ? "true" : "false";

	let verwalt = "";
	let artalt = "";
	if (ausweis.alternative_heizung) {
		verwalt += "Heizung  ";
	}
	if (ausweis.alternative_warmwasser) {
		verwalt += "Warmwasser  ";
	}
	if (ausweis.alternative_lueftung) {
		verwalt += "Lüftung  ";
	}
	if (ausweis.alternative_kuehlung) {
		verwalt += "Kühlung  ";
	}

	if (gebaeude.solarsystem_warmwasser) {
		artalt += "Solar  ";
	}
	if (gebaeude.waermepumpe) {
		artalt += "Erdwärme oder Umgebungswärme  ";
	}
	if (
		ausweis.brennstoff_2 == "Holz-Pellets" ||
		ausweis.brennstoff_2 == "Brennholz" ||
		ausweis.brennstoff_2 == "Holzhackschnitzel" ||
		ausweis.brennstoff_2 == "Nah/Fernwärme KWK EB" ||
		ausweis.brennstoff_2 == "Nah/Fernwärme HKW EB" ||
		ausweis.brennstoff_1 == "Holz-Pellets" ||
		ausweis.brennstoff_1 == "Brennholz" ||
		ausweis.brennstoff_1 == "Holzhackschnitzel" ||
		ausweis.brennstoff_1 == "Nah/Fernwärme KWK EB" ||
		ausweis.brennstoff_1 == "Nah/Fernwärme HKW EB"
	) {
		artalt += "Nachwachsend  ";
	}

	artalt = artalt || "keine";
	verwalt = verwalt || "keine";

	let gebaeudeTeil = berechnungen.getGebaeudeTeil();

	const energetischeNutzflaeche =
		energetischeNutzflaecheVerbrauchsausweisWohnen_2016(ausweis);

	let flaecheGekuehlt = ausweis.wird_gekuehlt ? energetischeNutzflaeche : 0;

	let endEnergieVerbrauchGesamt = Math.round(
		result.endEnergieVerbrauchGesamt
	);
	let primaerEnergieVerbrauchGesamt = Math.round(
		result.primaerEnergieVerbrauchGesamt
	);

	let energieTraeger = berechnungen.getEnergietraegerBezeichnung(
		ausweis.brennstoff_1 as string,
		ausweis.einheit_1 as string
	);
	let energieTraeger_2 = berechnungen.getEnergietraegerBezeichnung(
		ausweis.brennstoff_2 as string,
		ausweis.einheit_2 as string
	);

	let warmwasserZuschlag = Math.round(result.energieVerbrauchWarmwasser_1);

	let leerstandsZuschlagHeizung = Math.round(
		result.leerstandsZuschlagHeizung
	);
	let Aussteller_ID_DIB = "jens.cornelsen@ib-cornelsen.de";
	let Aussteller_PWD_DIBT = "62465E79F6A61F31C4DCA9E2AF788DD3";

	let energieVerbrauch_1 = Math.round(result.verbrauch_1_kwh);
	let energieVerbrauch_2 = Math.round(result.verbrauch_2_kwh);
	let energieVerbrauch_3 = Math.round(result.verbrauch_3_kwh);

	let xml = `<ZusatzdatenErfassung xmlns='http://energieausweis.dibt.de/WebServiceEnergie/DibtEnergieAusweisService'>
	<doc>
	<n1:EnEV-Energieausweis xmlns:n1=\"https://energieausweis.dibt.de/schema/Kontrollsystem_Versionsstand_2016-06-30.xsd\">
  <n1:Energieausweis-Daten EnEV-Version=\"2013\" Rechtsstand=\"2016-01-01\">
    <n1:Registriernummer>${ausweis.registriernummer}</n1:Registriernummer>
    <n1:Ausstellungsdatum>${erstellungsdatum}</n1:Ausstellungsdatum>
    <n1:Bundesland>${bundesland?.bundesland}</n1:Bundesland>
    <n1:Postleitzahl>${postleitzahl}</n1:Postleitzahl>
    <n1:Gebaeudeteil>${gebaeudeTeil}</n1:Gebaeudeteil>
    <n1:Baujahr-Gebaeude>${gebaeude.baujahr_gebaeude}</n1:Baujahr-Gebaeude>
    <n1:Altersklasse-Gebaeude>${bauAltersKlasseGebaeude}</n1:Altersklasse-Gebaeude>
    <n1:Baujahr-Waermeerzeuger>${gebaeude.baujahr_heizung}</n1:Baujahr-Waermeerzeuger>
    <n1:Altersklasse-Waermeerzeuger>${bauAltersKlasseAnlage}</n1:Altersklasse-Waermeerzeuger>
    <n1:wesentliche-Energietraeger>${energieTraeger}</n1:wesentliche-Energietraeger>
    <n1:Erneuerbare-Art>${artalt}</n1:Erneuerbare-Art>
    <n1:Erneuerbare-Verwendung>${verwalt}</n1:Erneuerbare-Verwendung>
    <n1:Lueftungsart-Fensterlueftung>${lueftungsKonzept["fensterlueftung"]}</n1:Lueftungsart-Fensterlueftung>
    <n1:Lueftungsart-Schachtlueftung>${lueftungsKonzept["schachtlueftung"]}</n1:Lueftungsart-Schachtlueftung>
    <n1:Lueftungsart-Anlage-o-WRG>${lueftungsKonzept["ohneRueckgewinnung"]}</n1:Lueftungsart-Anlage-o-WRG>
    <n1:Lueftungsart-Anlage-m-WRG>${lueftungsKonzept["mitRueckgewinnung"]}</n1:Lueftungsart-Anlage-m-WRG>
    <n1:Anlage-zur-Kuehlung>${anlageKuehlung}</n1:Anlage-zur-Kuehlung>
    <n1:Ausstellungsanlass>{berechnungen.anlass()}</n1:Ausstellungsanlass>    
    <n1:Datenerhebung-Aussteller>false</n1:Datenerhebung-Aussteller>
    <n1:Datenerhebung-Eigentuemer>true</n1:Datenerhebung-Eigentuemer>
    <n1:Wohngebaeude>
      <n1:Gebaeudetyp>${gebaeudeTyp}</n1:Gebaeudetyp>
      <n1:Anzahl-Wohneinheiten>${gebaeude.einheiten}</n1:Anzahl-Wohneinheiten>
      <n1:Gebaeudenutzflaeche>${energetischeNutzflaeche}</n1:Gebaeudenutzflaeche>
      <n1:Verbrauchswerte>
        <n1:Flaechenermittlung-AN-aus-Wohnflaeche>true</n1:Flaechenermittlung-AN-aus-Wohnflaeche>
        <n1:Wohnflaeche>${gebaeude.flaeche}</n1:Wohnflaeche>
        <n1:Keller-beheizt>${kellerBeheizt}</n1:Keller-beheizt>
        <n1:Energietraeger>
				<n1:Energietraeger-Verbrauch>${energieTraeger}</n1:Energietraeger-Verbrauch>
				<n1:Unterer-Heizwert>${heizwertfaktor_1.umrechnungsfaktor}</n1:Unterer-Heizwert>
				<n1:Primaerenergiefaktor>${heizwertfaktor_1.primaerenergiefaktor}</n1:Primaerenergiefaktor>
				<n1:Zeitraum>
					<n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
					<n1:Enddatum>${Zeitraum1bis}</n1:Enddatum>
					<n1:Verbrauchte-Menge>${ausweis.verbrauch_1}</n1:Verbrauchte-Menge>
					<n1:Energieverbrauch>${energieVerbrauch_1}</n1:Energieverbrauch>
					<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_1}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
					<n1:Warmwasserwertermittlung>${warmWasserErmittlung}</n1:Warmwasserwertermittlung>
					<n1:Klimafaktor>${klimafaktoren[0]}</n1:Klimafaktor>            
				</n1:Zeitraum>
				<n1:Zeitraum>
					<n1:Startdatum>${Zeitraum2von}</n1:Startdatum>
					<n1:Enddatum>${Zeitraum2bis}</n1:Enddatum>
					<n1:Verbrauchte-Menge>${ausweis.verbrauch_2}</n1:Verbrauchte-Menge>
					<n1:Energieverbrauch>${energieVerbrauch_2}</n1:Energieverbrauch>
					<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_1}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
					<n1:Warmwasserwertermittlung>${warmWasserErmittlung}</n1:Warmwasserwertermittlung>
					<n1:Klimafaktor>${klimafaktoren[1]}</n1:Klimafaktor>
				</n1:Zeitraum>
				<n1:Zeitraum>
					<n1:Startdatum>${Zeitraum3von}</n1:Startdatum>
					<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
					<n1:Verbrauchte-Menge>${ausweis.verbrauch_3}</n1:Verbrauchte-Menge>
					<n1:Energieverbrauch>${energieVerbrauch_3}</n1:Energieverbrauch>
					<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_1}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
					<n1:Warmwasserwertermittlung>${warmWasserErmittlung}</n1:Warmwasserwertermittlung>
					<n1:Klimafaktor>${klimafaktoren[2]}</n1:Klimafaktor>
				</n1:Zeitraum>
        </n1:Energietraeger>`;

	if (ausweis.zusaetzliche_heizquelle) {
		xml += `<n1:Energietraeger>
					<n1:Energietraeger-Verbrauch>${energieTraeger_2}</n1:Energietraeger-Verbrauch>
          <n1:Unterer-Heizwert>${heizwertfaktor_2.umrechnungsfaktor}</n1:Unterer-Heizwert>
          <n1:Primaerenergiefaktor>${heizwertfaktor_2.primaerenergiefaktor}</n1:Primaerenergiefaktor>
          <n1:Zeitraum>
            <n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
            <n1:Enddatum>${Zeitraum1bis}</n1:Enddatum>
            <n1:Verbrauchte-Menge>${ausweis.verbrauch_4}</n1:Verbrauchte-Menge>
            <n1:Energieverbrauch>${result.verbrauch_4_kwh}</n1:Energieverbrauch>
            <n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_2}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
            <n1:Warmwasserwertermittlung>${warmWasserErmittlung_2}</n1:Warmwasserwertermittlung>
            <n1:Klimafaktor>${klimafaktoren[0]}</n1:Klimafaktor>            
          </n1:Zeitraum>
          <n1:Zeitraum>
						<n1:Startdatum>${Zeitraum2von}</n1:Startdatum>
						<n1:Enddatum>${Zeitraum2bis}</n1:Enddatum>
						<n1:Verbrauchte-Menge>${ausweis.verbrauch_5}</n1:Verbrauchte-Menge>
						<n1:Energieverbrauch>${result.verbrauch_5_kwh}</n1:Energieverbrauch>
            <n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_2}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
            <n1:Warmwasserwertermittlung>${warmWasserErmittlung_2}</n1:Warmwasserwertermittlung>
            <n1:Klimafaktor>${klimafaktoren[1]}</n1:Klimafaktor>
          </n1:Zeitraum>
          <n1:Zeitraum>
						<n1:Startdatum>${Zeitraum3von}</n1:Startdatum>
						<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
						<n1:Verbrauchte-Menge>${ausweis.verbrauch_6}</n1:Verbrauchte-Menge>
						<n1:Energieverbrauch>${result.verbrauch_6_kwh}</n1:Energieverbrauch>
            <n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_2}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
            <n1:Warmwasserwertermittlung>${warmWasserErmittlung_2}</n1:Warmwasserwertermittlung>
            <n1:Klimafaktor>${klimafaktoren[2]}</n1:Klimafaktor>
          </n1:Zeitraum>
          
        </n1:Energietraeger>`;
	}

	xml += `<n1:Leerstandszuschlag-Heizung>
          <n1:Leerstandszuschlag-nach-Bekanntmachung>
            <n1:Leerstandsfaktor>${result.leerstand}</n1:Leerstandsfaktor>
            <n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
            <n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
            <n1:Leerstandszuschlag-kWh>${leerstandsZuschlagHeizung}</n1:Leerstandszuschlag-kWh>
            <n1:Primaerenergiefaktor>${heizwertfaktor_1.primaerenergiefaktor}</n1:Primaerenergiefaktor>
          </n1:Leerstandszuschlag-nach-Bekanntmachung>
        </n1:Leerstandszuschlag-Heizung>
        <n1:Leerstandszuschlag-Warmwasser>`;

	if (
		ausweis.warmwasser_enthalten &&
		(gebaeude.leerstand || 0) > 0 &&
		(ausweis.anteil_warmwasser_1 || 0) > 0
	) {
		xml += `<n1:keine-Nutzung-von-WW>${keineNutzungWarmwasser}</n1:keine-Nutzung-von-WW>
			<n1:kein-Leerstand>Kein längerer Leerstand Warmwasser zu berücksichtigen.</n1:kein-Leerstand>`;
	} else {
		xml += `<n1:keine-Nutzung-von-WW>${keineNutzungWarmwasser}</n1:keine-Nutzung-von-WW>
				  <n1:kein-Leerstand>Kein längerer Leerstand Warmwasser zu berücksichtigen.</n1:kein-Leerstand>`;
	}

	xml += `</n1:Leerstandszuschlag-Warmwasser>        
        		<n1:Warmwasserzuschlag>
					<n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
					<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
          <n1:Primaerenergiefaktor>${heizwertfaktor_1.primaerenergiefaktor}</n1:Primaerenergiefaktor>
          <n1:Warmwasserzuschlag-kWh>${warmwasserZuschlag}</n1:Warmwasserzuschlag-kWh>
        </n1:Warmwasserzuschlag>
        <n1:Kuehlzuschlag>
					<n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
					<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
          <n1:Gebaeudenutzflaeche-gekuehlt>${flaecheGekuehlt}</n1:Gebaeudenutzflaeche-gekuehlt>
          <n1:Primaerenergiefaktor>1.8</n1:Primaerenergiefaktor>
          <n1:Kuehlzuschlag-kWh>${result.kuehlungsZuschlag}</n1:Kuehlzuschlag-kWh>
        </n1:Kuehlzuschlag>
        <n1:Mittlerer-Endenergieverbrauch>${endEnergieVerbrauchGesamt}</n1:Mittlerer-Endenergieverbrauch>
        <n1:Mittlerer-Primaerenergieverbrauch>${primaerEnergieVerbrauchGesamt}</n1:Mittlerer-Primaerenergieverbrauch>
        <n1:Energieeffizienzklasse>${energieeffizienzKlasse}</n1:Energieeffizienzklasse>
      </n1:Verbrauchswerte>
    </n1:Wohngebaeude>
    <n1:Empfehlungen-moeglich>${empfehlungenMoeglich}</n1:Empfehlungen-moeglich>`;

	let i = 1;
	for (const empfehlung of empfehlungen) {
		let description = empfehlung.massnahme.replace(/\n/g, "");
		xml += `<n1:Modernisierungsempfehlungen>
				<n1:Nummer>${i}</n1:Nummer>
				<n1:Bauteil-Anlagenteil>${empfehlung["anlagenteil"]}</n1:Bauteil-Anlagenteil>
				<n1:Massnahmenbeschreibung>${description}</n1:Massnahmenbeschreibung>
				<n1:Modernisierungskombination>in Zusammenhang mit größerer Modernisierung</n1:Modernisierungskombination>
			</n1:Modernisierungsempfehlungen>`;
		i++;
	}

	xml += `<n1:Extrablatt-Modernisierung>false</n1:Extrablatt-Modernisierung>
    <n1:Softwarehersteller-Programm-Version>Version 2.0</n1:Softwarehersteller-Programm-Version>
  </n1:Energieausweis-Daten>
</n1:EnEV-Energieausweis>
</doc>
<ausweisnummer>${ausweis.registriernummer}</ausweisnummer>
<username>${Aussteller_ID_DIB}</username>
<passwort>${Aussteller_PWD_DIBT}</passwort>
</ZusatzdatenErfassung>
`;

	return xml;
}
