import { funktionWaermesenkenA8A12 } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionWaermesenkenA8A12.js";
import { A7A2BerechnungWaermequellenSolareEinstrahlung } from "#lib/Berechnungen/BedarfsausweisWohnen/A7A2BerechnungWaermequellenSolareEinstrahlung.js";
import { funktionInterneWaermequellenA8 }  from "#lib/Berechnungen/BedarfsausweisWohnen/funktionInterneWaermequellenA8.js";

export function A8BerechnungWaermequellenAusAnlagentechnikHeizung() { 

const result = funktionWaermesenkenA8A12();
const waermeSenken = result.waermeSenken;
const belastungsgrade = result.belastungsgrade;

const einstrahlung = A7A2BerechnungWaermequellenSolareEinstrahlung();
    const summeErgebnisseJanuar = einstrahlung.summeErgebnisseJanuar;
    const summeErgebnisseFebruar = einstrahlung.summeErgebnisseFebruar;
    const summeErgebnisseMaerz = einstrahlung.summeErgebnisseMaerz;
    const summeErgebnisseApril = einstrahlung.summeErgebnisseApril;
    const summeErgebnisseMai = einstrahlung.summeErgebnisseMai;
    const summeErgebnisseJuni = einstrahlung.summeErgebnisseJuni;
    const summeErgebnisseJuli = einstrahlung.summeErgebnisseJuli;
    const summeErgebnisseAugust = einstrahlung.summeErgebnisseAugust;
    const summeErgebnisseSeptember = einstrahlung.summeErgebnisseSeptember;
    const summeErgebnisseOktober = einstrahlung.summeErgebnisseOktober;
    const summeErgebnisseNovember = einstrahlung.summeErgebnisseNovember;
    const summeErgebnisseDezember = einstrahlung.summeErgebnisseDezember;

const resultInterneWaermeQuellen = funktionInterneWaermequellenA8();
const interneWaermeQuellenProMonat = resultInterneWaermeQuellen.interneWaermeQuellenProMonat;

let TageMonat = {
    Januar: 31,
    Februar: 28,
    März: 31,
    April: 30,
    Mai: 31,
    Juni: 30,
    Juli: 31,
    August: 31,
    September: 30,
    Oktober: 31,
    November: 30,
    Dezember: 31
  };

const FaktorUmrechnung = {
  Januar: 1000 / (24 * TageMonat.Januar),
  Februar: 1000 / (24 * TageMonat.Februar),
  März: 1000 / (24 * TageMonat.März),
  April: 1000 / (24 * TageMonat.April),
  Mai: 1000 / (24 * TageMonat.Mai),
  Juni: 1000 / (24 * TageMonat.Juni),
  Juli: 1000 / (24 * TageMonat.Juli),
  August: 1000 / (24 * TageMonat.August),
  September: 1000 / (24 * TageMonat.September),
  Oktober: 1000 / (24 * TageMonat.Oktober),
  November: 1000 / (24 * TageMonat.November),
  Dezember: 1000 / (24 * TageMonat.Dezember)
};

const WaermeQuellenGesamtJanuar = (interneWaermeQuellenProMonat.Januar + 0.5 * summeErgebnisseJanuar) * FaktorUmrechnung.Januar;
const WaermeQuellenGesamtFebruar = (interneWaermeQuellenProMonat.Februar + 0.5 * summeErgebnisseFebruar) * FaktorUmrechnung.Februar;
const WaermeQuellenGesamtMaerz = (interneWaermeQuellenProMonat.März + 0.5 * summeErgebnisseMaerz) * FaktorUmrechnung.März;
const WaermeQuellenGesamtApril = (interneWaermeQuellenProMonat.April + 0.5 * summeErgebnisseApril) * FaktorUmrechnung.April;
const WaermeQuellenGesamtMai = (interneWaermeQuellenProMonat.Mai + 0.5 * summeErgebnisseMai) * FaktorUmrechnung.Mai;
const WaermeQuellenGesamtJuni = (interneWaermeQuellenProMonat.Juni + 0.5 * summeErgebnisseJuni) * FaktorUmrechnung.Juni;
const WaermeQuellenGesamtJuli = (interneWaermeQuellenProMonat.Juli + 0.5 * summeErgebnisseJuli) * FaktorUmrechnung.Juli;
const WaermeQuellenGesamtAugust = (interneWaermeQuellenProMonat.August + 0.5 * summeErgebnisseAugust) * FaktorUmrechnung.August;
const WaermeQuellenGesamtSeptember = (interneWaermeQuellenProMonat.September + 0.5 * summeErgebnisseSeptember) * FaktorUmrechnung.September;
const WaermeQuellenGesamtOktober = (interneWaermeQuellenProMonat.Oktober + 0.5 * summeErgebnisseOktober) * FaktorUmrechnung.Oktober;
const WaermeQuellenGesamtNovember = (interneWaermeQuellenProMonat.November + 0.5 * summeErgebnisseNovember) * FaktorUmrechnung.November;
const WaermeQuellenGesamtDezember = (interneWaermeQuellenProMonat.Dezember + 0.5 * summeErgebnisseDezember) * FaktorUmrechnung.Dezember;

const waermeSenkenBereinigtJanuar = Math.max(waermeSenken.Januar - WaermeQuellenGesamtJanuar, 0);
const waermeSenkenBereinigtFebruar = Math.max(waermeSenken.Februar - WaermeQuellenGesamtFebruar, 0);
const waermeSenkenBereinigtMaerz = Math.max(waermeSenken.März - WaermeQuellenGesamtMaerz, 0);
const waermeSenkenBereinigtApril = Math.max(waermeSenken.April - WaermeQuellenGesamtApril, 0);
const waermeSenkenBereinigtMai = Math.max(waermeSenken.Mai - WaermeQuellenGesamtMai, 0);
const waermeSenkenBereinigtJuni = Math.max(waermeSenken.Juni - WaermeQuellenGesamtJuni, 0);
const waermeSenkenBereinigtJuli = Math.max(waermeSenken.Juli - WaermeQuellenGesamtJuli, 0);
const waermeSenkenBereinigtAugust = Math.max(waermeSenken.August - WaermeQuellenGesamtAugust, 0);
const waermeSenkenBereinigtSeptember = Math.max(waermeSenken.September - WaermeQuellenGesamtSeptember, 0);
const waermeSenkenBereinigtOktober = Math.max(waermeSenken.Oktober - WaermeQuellenGesamtOktober, 0);
const waermeSenkenBereinigtNovember = Math.max(waermeSenken.November - WaermeQuellenGesamtNovember, 0);
const waermeSenkenBereinigtDezember = Math.max(waermeSenken.Dezember - WaermeQuellenGesamtDezember, 0);

const maxBelastungsgrad
 = Math.max(
  belastungsgrade.Januar,
  belastungsgrade.Februar,
  belastungsgrade.März,
  belastungsgrade.April,
  belastungsgrade.Mai,
  belastungsgrade.Juni,
  belastungsgrade.Juli,
  belastungsgrade.August,
  belastungsgrade.September,
  belastungsgrade.Oktober,
  belastungsgrade.November,
  belastungsgrade.Dezember
);
const belastungsgradeBereinigt = {
  Januar: belastungsgrade.Januar / maxBelastungsgrad,
  Februar: belastungsgrade.Februar / maxBelastungsgrad,
  März: belastungsgrade.März / maxBelastungsgrad,
  April: belastungsgrade.April / maxBelastungsgrad,
  Mai: belastungsgrade.Mai / maxBelastungsgrad,
  Juni: belastungsgrade.Juni / maxBelastungsgrad,
  Juli: belastungsgrade.Juli / maxBelastungsgrad,
  August: belastungsgrade.August / maxBelastungsgrad,
  September: belastungsgrade.September / maxBelastungsgrad,
  Oktober: belastungsgrade.Oktober / maxBelastungsgrad,
  November: belastungsgrade.November / maxBelastungsgrad,
  Dezember: belastungsgrade.Dezember / maxBelastungsgrad
};

const FaktorNutzbareWaerme = 0.077;  // aus Eingabe (Tabelle 141): Verteilung und Erzeugung im beheizten Bereich, Speicherung im unbeheiztem Bereich - 55°C/45°C

const WaermeQuellenAnlagentechnikHeizungJanuar = (waermeSenkenBereinigtJanuar * belastungsgradeBereinigt.Januar * FaktorNutzbareWaerme) / FaktorUmrechnung.Januar;
const WaermeQuellenAnlagentechnikHeizungFebruar = (waermeSenkenBereinigtFebruar * belastungsgradeBereinigt.Februar * FaktorNutzbareWaerme) / FaktorUmrechnung.Februar;
const WaermeQuellenAnlagentechnikHeizungMaerz = (waermeSenkenBereinigtMaerz * belastungsgradeBereinigt.März * FaktorNutzbareWaerme) / FaktorUmrechnung.März;
const WaermeQuellenAnlagentechnikHeizungApril = (waermeSenkenBereinigtApril * belastungsgradeBereinigt.April * FaktorNutzbareWaerme) / FaktorUmrechnung.April;
const WaermeQuellenAnlagentechnikHeizungMai = (waermeSenkenBereinigtMai * belastungsgradeBereinigt.Mai * FaktorNutzbareWaerme) / FaktorUmrechnung.Mai;
const WaermeQuellenAnlagentechnikHeizungJuni = (waermeSenkenBereinigtJuni * belastungsgradeBereinigt.Juni * FaktorNutzbareWaerme) / FaktorUmrechnung.Juni;
const WaermeQuellenAnlagentechnikHeizungJuli = (waermeSenkenBereinigtJuli * belastungsgradeBereinigt.Juli * FaktorNutzbareWaerme) / FaktorUmrechnung.Juli;
const WaermeQuellenAnlagentechnikHeizungAugust = (waermeSenkenBereinigtAugust * belastungsgradeBereinigt.August * FaktorNutzbareWaerme) / FaktorUmrechnung.August;
const WaermeQuellenAnlagentechnikHeizungSeptember = (waermeSenkenBereinigtSeptember * belastungsgradeBereinigt.September * FaktorNutzbareWaerme) / FaktorUmrechnung.September;
const WaermeQuellenAnlagentechnikHeizungOktober = (waermeSenkenBereinigtOktober * belastungsgradeBereinigt.Oktober * FaktorNutzbareWaerme) / FaktorUmrechnung.Oktober;
const WaermeQuellenAnlagentechnikHeizungNovember = (waermeSenkenBereinigtNovember * belastungsgradeBereinigt.November * FaktorNutzbareWaerme) / FaktorUmrechnung.November;
const WaermeQuellenAnlagentechnikHeizungDezember = (waermeSenkenBereinigtDezember * belastungsgradeBereinigt.Dezember * FaktorNutzbareWaerme) / FaktorUmrechnung.Dezember;

return {
  TageMonat,
  waermeSenken,
  WaermeQuellenGesamtJanuar,
  WaermeQuellenGesamtFebruar,
  WaermeQuellenGesamtMaerz,
  WaermeQuellenGesamtApril,
  WaermeQuellenGesamtMai,
  WaermeQuellenGesamtJuni,
  WaermeQuellenGesamtJuli,
  WaermeQuellenGesamtAugust,
  WaermeQuellenGesamtSeptember,
  WaermeQuellenGesamtOktober,
  WaermeQuellenGesamtNovember,
  WaermeQuellenGesamtDezember,
  waermeSenkenBereinigtJanuar,
  waermeSenkenBereinigtFebruar,
  waermeSenkenBereinigtMaerz,
  waermeSenkenBereinigtApril,
  waermeSenkenBereinigtMai,
  waermeSenkenBereinigtJuni,
  waermeSenkenBereinigtJuli,
  waermeSenkenBereinigtAugust,
  waermeSenkenBereinigtSeptember,
  waermeSenkenBereinigtOktober,
  waermeSenkenBereinigtNovember,
  waermeSenkenBereinigtDezember,
  belastungsgrade,
  maxBelastungsgrad,
  belastungsgradeBereinigt,
  WaermeQuellenAnlagentechnikHeizungJanuar,
  WaermeQuellenAnlagentechnikHeizungFebruar,
  WaermeQuellenAnlagentechnikHeizungMaerz,
  WaermeQuellenAnlagentechnikHeizungApril,
  WaermeQuellenAnlagentechnikHeizungMai,
  WaermeQuellenAnlagentechnikHeizungJuni,
  WaermeQuellenAnlagentechnikHeizungJuli,
  WaermeQuellenAnlagentechnikHeizungAugust,
  WaermeQuellenAnlagentechnikHeizungSeptember,
  WaermeQuellenAnlagentechnikHeizungOktober,
  WaermeQuellenAnlagentechnikHeizungNovember,
  WaermeQuellenAnlagentechnikHeizungDezember,
  FaktorNutzbareWaerme
};

}