#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Service functions for OEP logging

Read data from MaStR API, process, and write to OEP

SPDX-License-Identifier: AGPL-3.0-or-later
"""

__copyright__ = "© Reiner Lemoine Institut"
__license__ = "GNU Affero General Public License Version 3 (AGPL-3.0)"
__url__ = "https://www.gnu.org/licenses/agpl-3.0.en.html"
__author__ = "Ludee; christian-rli"
__issue__ = "https://github.com/OpenEnergyPlatform/examples/issues/52"
__version__ = "v0.10.0"


import os
import open_mastr.soap_api.config as lc

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float, DateTime, Boolean
from collections import namedtuple
import logging


log = logging.getLogger(__name__)
Base = declarative_base()

on_rtd = os.environ.get('READTHEDOCS', None) == 'True'


class Wind(Base):
    __tablename__ = 'mastr_wind'
    EinheitMastrNummer = Column(String(256))
    Id  = Column(Integer, primary_key=True)
    lid = Column(Integer)
    Name = Column(String(256))
    Einheitart = Column(String(256))
    Einheittyp = Column(String(256))
    Standort = Column(String(256))
    Bruttoleistung = Column(Float)
    Erzeugungsleistung = Column(Float)
    EinheitBetriebsstatus = Column(String(256))
    Anlagenbetreiber = Column(String(256))
    EegMastrNummer = Column(String(256))
    KwkMastrNummer = Column(String(256))
    SpeMastrNummer = Column(String(256))
    GenMastrNummer = Column(String(256))
    BestandsanlageMastrNummer = Column(String(256))
    NichtVorhandenInMigriertenEinheiten = Column(String(256))
    version = Column(String(256))
    timestamp = Column(DateTime)
    lid_w = Column(Integer)
    Ergebniscode = Column(String(256))
    AufrufVeraltet = Column(Boolean)
    AufrufLebenszeitEnde = Column(String(256))
    AufrufVersion = Column(String(256))
    DatumLetzteAktualisierung = Column(String(256))
    LokationMastrNummer = Column(String(256))
    NetzbetreiberpruefungStatus = Column(String(256))
    NetzbetreiberpruefungDatum = Column(String(256))
    NetzbetreiberMastrNummer = Column(String(256))
    Land = Column(String(256))
    Bundesland = Column(String(256))
    Landkreis = Column(String(256))
    Gemeinde = Column(String(256))
    Gemeindeschluessel = Column(String(256))
    Postleitzahl = Column(String(256))
    Gemarkung = Column(String(256))
    FlurFlurstuecknummern = Column(String(256))
    Strasse = Column(String(256))
    StrasseNichtGefunden = Column(Boolean)
    Hausnummer = Column(String(256))
    HausnummerNichtGefunden = Column(Boolean)
    Adresszusatz = Column(String(256))
    Ort = Column(String(256))
    Laengengrad = Column(String(256))
    Breitengrad = Column(String(256))
    UtmZonenwert = Column(String(256))
    UtmEast = Column(String(256))
    UtmNorth = Column(String(256))
    GaussKruegerHoch = Column(String(256))
    GaussKruegerRechts = Column(String(256))
    Meldedatum = Column(String(256))
    GeplantesInbetriebnahmedatum = Column(String(256))
    Inbetriebnahmedatum = Column(String(256))
    DatumEndgueltigeStilllegung = Column(String(256))
    DatumBeginnVoruebergehendeStilllegung = Column(String(256))
    DatumWiederaufnahmeBetrieb = Column(String(256))
    EinheitBetriebsstatus_w = Column(String(256))
    BestandsanlageMastrNummer_w = Column(String(256))
    NichtVorhandenInMigriertenEinheiten_w = Column(String(256))
    NameStromerzeugungseinheit = Column(String(256))
    Weic = Column(String(256))
    WeicDisplayName = Column(String(256))
    Kraftwerksnummer = Column(String(256))
    Energietraeger = Column(String(256))
    Bruttoleistung_w = Column(Float)
    Nettonennleistung = Column(String(256))
    AnschlussAnHoechstOderHochSpannung = Column(String(256))
    Schwarzstartfaehigkeit = Column(String(256))
    Inselbetriebsfaehigkeit = Column(String(256))
    Einsatzverantwortlicher = Column(String(256))
    FernsteuerbarkeitNb = Column(String(256))
    FernsteuerbarkeitDv = Column(String(256))
    FernsteuerbarkeitDr = Column(String(256))
    Einspeisungsart = Column(String(256))
    PraequalifiziertFuerRegelenergie = Column(String(256))
    GenMastrNummer_w = Column(String(256))
    NameWindpark = Column(String(256))
    Lage = Column(String(256))
    Seelage = Column(String(256))
    ClusterOstsee = Column(String(256))
    ClusterNordsee = Column(String(256))
    Technologie = Column(String(256))
    Typenbezeichnung = Column(String(256))
    Nabenhoehe = Column(String(256))
    Rotordurchmesser = Column(String(256))
    AuflageAbschaltungLeistungsbegrenzung = Column(String(256))
    Wassertiefe = Column(String(256))
    Kuestenentfernung = Column(String(256))
    EegMastrNummer_w = Column(String(256))
    HerstellerID = Column(String(256))
    HerstellerName = Column(String(256))
    version_w = Column(String(256))
    timestamp_w = Column(DateTime)
    lid_e = Column(Integer)
    Ergebniscode_e = Column(String(256))
    AufrufVeraltet_e = Column(Boolean)
    AufrufLebenszeitEnde_e = Column(String(256))
    AufrufVersion_e = Column(String(256))
    Meldedatum_e = Column(String(256))
    DatumLetzteAktualisierung_e = Column(String(256))
    EegInbetriebnahmedatum = Column(String(256))
    AnlagenkennzifferAnlagenregister = Column(String(256))
    AnlagenschluesselEeg = Column(String(256))
    PrototypAnlage = Column(String(256))
    PilotAnlage = Column(String(256))
    InstallierteLeistung = Column(String(256))
    VerhaeltnisReferenzertragErtrag5Jahre = Column(String(256))
    VerhaeltnisReferenzertragErtrag10Jahre = Column(String(256))
    VerhaeltnisReferenzertragErtrag15Jahre = Column(String(256))
    AusschreibungZuschlag = Column(String(256))
    Zuschlagsnummer = Column(String(256))
    AnlageBetriebsstatus = Column(String(256))
    VerknuepfteEinheit = Column(String(256))
    version_e = Column(String(256))
    timestamp_e = Column(String(256))


class Solar(Base):
    __tablename__ = 'mastr_solar'
    EinheitMastrNummer = Column(String(256))
    Id  = Column(Integer, primary_key=True)
    lid = Column(Integer)
    Name = Column(String(256))
    Einheitart = Column(String(256))
    Einheittyp = Column(String(256))
    Standort = Column(String(256))
    Bruttoleistung = Column(Float)
    Erzeugungsleistung = Column(Float)
    EinheitBetriebsstatus = Column(String(256))
    Anlagenbetreiber = Column(String(256))
    EegMastrNummer = Column(String(256))
    KwkMastrNummer = Column(String(256))
    SpeMastrNummer = Column(String(256))
    GenMastrNummer = Column(String(256))
    BestandsanlageMastrNummer = Column(String(256))
    NichtVorhandenInMigriertenEinheiten = Column(String(256))
    version = Column(String(256))
    timestamp = Column(DateTime)
    lid_w = Column(Integer)
    Ergebniscode = Column(String(256))
    AufrufVeraltet = Column(Boolean)
    AufrufLebenszeitEnde = Column(String(256))
    AufrufVersion = Column(String(256))
    DatumLetzteAktualisierung = Column(String(256))
    LokationMastrNummer = Column(String(256))
    NetzbetreiberpruefungStatus = Column(String(256))
    NetzbetreiberpruefungDatum = Column(String(256))
    NetzbetreiberMastrNummer = Column(String(256))
    Land = Column(String(256))
    Bundesland = Column(String(256))
    Landkreis = Column(String(256))
    Gemeinde = Column(String(256))
    Gemeindeschluessel = Column(String(256))
    Postleitzahl = Column(String(256))
    Gemarkung = Column(String(256))
    FlurFlurstuecknummern = Column(String(256))
    Strasse = Column(String(256))
    StrasseNichtGefunden = Column(Boolean)
    Hausnummer = Column(String(256))
    HausnummerNichtGefunden = Column(Boolean)
    Adresszusatz = Column(String(256))
    Ort = Column(String(256))
    Laengengrad = Column(String(256))
    Breitengrad = Column(String(256))
    UtmZonenwert = Column(String(256))
    UtmEast = Column(String(256))
    UtmNorth = Column(String(256))
    GaussKruegerHoch = Column(String(256))
    GaussKruegerRechts = Column(String(256))
    Meldedatum = Column(String(256))
    GeplantesInbetriebnahmedatum = Column(String(256))
    Inbetriebnahmedatum = Column(String(256))
    DatumEndgueltigeStilllegung = Column(String(256))
    DatumBeginnVoruebergehendeStilllegung = Column(String(256))
    DatumWiederaufnahmeBetrieb = Column(String(256))
    EinheitBetriebsstatus_w = Column(String(256))
    BestandsanlageMastrNummer_w = Column(String(256))
    NichtVorhandenInMigriertenEinheiten_w = Column(String(256))
    NameStromerzeugungseinheit = Column(String(256))
    Weic = Column(String(256))
    WeicDisplayName = Column(String(256))
    Kraftwerksnummer = Column(String(256))
    Energietraeger = Column(String(256))
    Bruttoleistung_w = Column(Float)
    Nettonennleistung = Column(String(256))
    AnschlussAnHoechstOderHochSpannung = Column(String(256))
    Schwarzstartfaehigkeit = Column(String(256))
    Inselbetriebsfaehigkeit = Column(String(256))
    Einsatzverantwortlicher = Column(String(256))
    FernsteuerbarkeitNb = Column(String(256))
    FernsteuerbarkeitDv = Column(String(256))
    FernsteuerbarkeitDr = Column(String(256))
    Einspeisungsart = Column(String(256))
    PraequalifiziertFuerRegelenergie = Column(String(256))
    GenMastrNummer_w = Column(String(256))
    NameWindpark = Column(String(256))
    Lage = Column(String(256))
    Seelage = Column(String(256))
    ClusterOstsee = Column(String(256))
    ClusterNordsee = Column(String(256))
    Technologie = Column(String(256))
    Typenbezeichnung = Column(String(256))
    Nabenhoehe = Column(String(256))
    Rotordurchmesser = Column(String(256))
    AuflageAbschaltungLeistungsbegrenzung = Column(String(256))
    Wassertiefe = Column(String(256))
    Kuestenentfernung = Column(String(256))
    EegMastrNummer_w = Column(String(256))
    HerstellerID = Column(String(256))
    HerstellerName = Column(String(256))
    version_w = Column(String(256))
    timestamp_w = Column(DateTime)
    lid_e = Column(Integer)
    Ergebniscode_e = Column(String(256))
    AufrufVeraltet_e = Column(Boolean)
    AufrufLebenszeitEnde_e = Column(String(256))
    AufrufVersion_e = Column(String(256))
    Meldedatum_e = Column(String(256))
    DatumLetzteAktualisierung_e = Column(String(256))
    EegInbetriebnahmedatum = Column(String(256))
    AnlagenkennzifferAnlagenregister = Column(String(256))
    AnlagenschluesselEeg = Column(String(256))
    PrototypAnlage = Column(String(256))
    PilotAnlage = Column(String(256))
    InstallierteLeistung = Column(String(256))
    VerhaeltnisReferenzertragErtrag5Jahre = Column(String(256))
    VerhaeltnisReferenzertragErtrag10Jahre = Column(String(256))
    VerhaeltnisReferenzertragErtrag15Jahre = Column(String(256))
    AusschreibungZuschlag = Column(String(256))
    Zuschlagsnummer = Column(String(256))
    AnlageBetriebsstatus = Column(String(256))
    VerknuepfteEinheit = Column(String(256))
    version_e = Column(String(256))
    timestamp_e = Column(String(256))

class Biomass(Base):
    __tablename__ = 'mastr_biomass'
    EinheitMastrNummer = Column(String(256))
    Id  = Column(Integer, primary_key=True)
    lid = Column(Integer)
    Name = Column(String(256))
    Einheitart = Column(String(256))
    Einheittyp = Column(String(256))
    Standort = Column(String(256))
    Bruttoleistung = Column(Float)
    Erzeugungsleistung = Column(Float)
    EinheitBetriebsstatus = Column(String(256))
    Anlagenbetreiber = Column(String(256))
    EegMastrNummer = Column(String(256))
    KwkMastrNummer = Column(String(256))
    SpeMastrNummer = Column(String(256))
    GenMastrNummer = Column(String(256))
    BestandsanlageMastrNummer = Column(String(256))
    NichtVorhandenInMigriertenEinheiten = Column(String(256))
    version = Column(String(256))
    timestamp = Column(DateTime)
    lid_w = Column(Integer)
    Ergebniscode = Column(String(256))
    AufrufVeraltet = Column(Boolean)
    AufrufLebenszeitEnde = Column(String(256))
    AufrufVersion = Column(String(256))
    DatumLetzteAktualisierung = Column(String(256))
    LokationMastrNummer = Column(String(256))
    NetzbetreiberpruefungStatus = Column(String(256))
    NetzbetreiberpruefungDatum = Column(String(256))
    NetzbetreiberMastrNummer = Column(String(256))
    Land = Column(String(256))
    Bundesland = Column(String(256))
    Landkreis = Column(String(256))
    Gemeinde = Column(String(256))
    Gemeindeschluessel = Column(String(256))
    Postleitzahl = Column(String(256))
    Gemarkung = Column(String(256))
    FlurFlurstuecknummern = Column(String(256))
    Strasse = Column(String(256))
    StrasseNichtGefunden = Column(Boolean)
    Hausnummer = Column(String(256))
    HausnummerNichtGefunden = Column(Boolean)
    Adresszusatz = Column(String(256))
    Ort = Column(String(256))
    Laengengrad = Column(String(256))
    Breitengrad = Column(String(256))
    UtmZonenwert = Column(String(256))
    UtmEast = Column(String(256))
    UtmNorth = Column(String(256))
    GaussKruegerHoch = Column(String(256))
    GaussKruegerRechts = Column(String(256))
    Meldedatum = Column(String(256))
    GeplantesInbetriebnahmedatum = Column(String(256))
    Inbetriebnahmedatum = Column(String(256))
    DatumEndgueltigeStilllegung = Column(String(256))
    DatumBeginnVoruebergehendeStilllegung = Column(String(256))
    DatumWiederaufnahmeBetrieb = Column(String(256))
    EinheitBetriebsstatus_w = Column(String(256))
    BestandsanlageMastrNummer_w = Column(String(256))
    NichtVorhandenInMigriertenEinheiten_w = Column(String(256))
    NameStromerzeugungseinheit = Column(String(256))
    Weic = Column(String(256))
    WeicDisplayName = Column(String(256))
    Kraftwerksnummer = Column(String(256))
    Energietraeger = Column(String(256))
    Bruttoleistung_w = Column(Float)
    Nettonennleistung = Column(String(256))
    AnschlussAnHoechstOderHochSpannung = Column(String(256))
    Schwarzstartfaehigkeit = Column(String(256))
    Inselbetriebsfaehigkeit = Column(String(256))
    Einsatzverantwortlicher = Column(String(256))
    FernsteuerbarkeitNb = Column(String(256))
    FernsteuerbarkeitDv = Column(String(256))
    FernsteuerbarkeitDr = Column(String(256))
    Einspeisungsart = Column(String(256))
    PraequalifiziertFuerRegelenergie = Column(String(256))
    GenMastrNummer_w = Column(String(256))
    NameWindpark = Column(String(256))
    Lage = Column(String(256))
    Seelage = Column(String(256))
    ClusterOstsee = Column(String(256))
    ClusterNordsee = Column(String(256))
    Technologie = Column(String(256))
    Typenbezeichnung = Column(String(256))
    Nabenhoehe = Column(String(256))
    Rotordurchmesser = Column(String(256))
    AuflageAbschaltungLeistungsbegrenzung = Column(String(256))
    Wassertiefe = Column(String(256))
    Kuestenentfernung = Column(String(256))
    EegMastrNummer_w = Column(String(256))
    HerstellerID = Column(String(256))
    HerstellerName = Column(String(256))
    version_w = Column(String(256))
    timestamp_w = Column(DateTime)
    lid_e = Column(Integer)
    Ergebniscode_e = Column(String(256))
    AufrufVeraltet_e = Column(Boolean)
    AufrufLebenszeitEnde_e = Column(String(256))
    AufrufVersion_e = Column(String(256))
    Meldedatum_e = Column(String(256))
    DatumLetzteAktualisierung_e = Column(String(256))
    EegInbetriebnahmedatum = Column(String(256))
    AnlagenkennzifferAnlagenregister = Column(String(256))
    AnlagenschluesselEeg = Column(String(256))
    PrototypAnlage = Column(String(256))
    PilotAnlage = Column(String(256))
    InstallierteLeistung = Column(String(256))
    VerhaeltnisReferenzertragErtrag5Jahre = Column(String(256))
    VerhaeltnisReferenzertragErtrag10Jahre = Column(String(256))
    VerhaeltnisReferenzertragErtrag15Jahre = Column(String(256))
    AusschreibungZuschlag = Column(String(256))
    Zuschlagsnummer = Column(String(256))
    AnlageBetriebsstatus = Column(String(256))
    VerknuepfteEinheit = Column(String(256))
    version_e = Column(String(256))
    timestamp_e = Column(String(256))

class Hydro(Base):
    __tablename__ = 'mastr_hydro'
    EinheitMastrNummer = Column(String(256))
    Id  = Column(Integer, primary_key=True)
    lid = Column(Integer)
    Name = Column(String(256))
    Einheitart = Column(String(256))
    Einheittyp = Column(String(256))
    Standort = Column(String(256))
    Bruttoleistung = Column(Float)
    Erzeugungsleistung = Column(Float)
    EinheitBetriebsstatus = Column(String(256))
    Anlagenbetreiber = Column(String(256))
    EegMastrNummer = Column(String(256))
    KwkMastrNummer = Column(String(256))
    SpeMastrNummer = Column(String(256))
    GenMastrNummer = Column(String(256))
    BestandsanlageMastrNummer = Column(String(256))
    NichtVorhandenInMigriertenEinheiten = Column(String(256))
    version = Column(String(256))
    timestamp = Column(DateTime)
    lid_w = Column(Integer)
    Ergebniscode = Column(String(256))
    AufrufVeraltet = Column(Boolean)
    AufrufLebenszeitEnde = Column(String(256))
    AufrufVersion = Column(String(256))
    DatumLetzteAktualisierung = Column(String(256))
    LokationMastrNummer = Column(String(256))
    NetzbetreiberpruefungStatus = Column(String(256))
    NetzbetreiberpruefungDatum = Column(String(256))
    NetzbetreiberMastrNummer = Column(String(256))
    Land = Column(String(256))
    Bundesland = Column(String(256))
    Landkreis = Column(String(256))
    Gemeinde = Column(String(256))
    Gemeindeschluessel = Column(String(256))
    Postleitzahl = Column(String(256))
    Gemarkung = Column(String(256))
    FlurFlurstuecknummern = Column(String(256))
    Strasse = Column(String(256))
    StrasseNichtGefunden = Column(Boolean)
    Hausnummer = Column(String(256))
    HausnummerNichtGefunden = Column(Boolean)
    Adresszusatz = Column(String(256))
    Ort = Column(String(256))
    Laengengrad = Column(String(256))
    Breitengrad = Column(String(256))
    UtmZonenwert = Column(String(256))
    UtmEast = Column(String(256))
    UtmNorth = Column(String(256))
    GaussKruegerHoch = Column(String(256))
    GaussKruegerRechts = Column(String(256))
    Meldedatum = Column(String(256))
    GeplantesInbetriebnahmedatum = Column(String(256))
    Inbetriebnahmedatum = Column(String(256))
    DatumEndgueltigeStilllegung = Column(String(256))
    DatumBeginnVoruebergehendeStilllegung = Column(String(256))
    DatumWiederaufnahmeBetrieb = Column(String(256))
    EinheitBetriebsstatus_w = Column(String(256))
    BestandsanlageMastrNummer_w = Column(String(256))
    NichtVorhandenInMigriertenEinheiten_w = Column(String(256))
    NameStromerzeugungseinheit = Column(String(256))
    Weic = Column(String(256))
    WeicDisplayName = Column(String(256))
    Kraftwerksnummer = Column(String(256))
    Energietraeger = Column(String(256))
    Bruttoleistung_w = Column(Float)
    Nettonennleistung = Column(String(256))
    AnschlussAnHoechstOderHochSpannung = Column(String(256))
    Schwarzstartfaehigkeit = Column(String(256))
    Inselbetriebsfaehigkeit = Column(String(256))
    Einsatzverantwortlicher = Column(String(256))
    FernsteuerbarkeitNb = Column(String(256))
    FernsteuerbarkeitDv = Column(String(256))
    FernsteuerbarkeitDr = Column(String(256))
    Einspeisungsart = Column(String(256))
    PraequalifiziertFuerRegelenergie = Column(String(256))
    GenMastrNummer_w = Column(String(256))
    NameWindpark = Column(String(256))
    Lage = Column(String(256))
    Seelage = Column(String(256))
    ClusterOstsee = Column(String(256))
    ClusterNordsee = Column(String(256))
    Technologie = Column(String(256))
    Typenbezeichnung = Column(String(256))
    Nabenhoehe = Column(String(256))
    Rotordurchmesser = Column(String(256))
    AuflageAbschaltungLeistungsbegrenzung = Column(String(256))
    Wassertiefe = Column(String(256))
    Kuestenentfernung = Column(String(256))
    EegMastrNummer_w = Column(String(256))
    HerstellerID = Column(String(256))
    HerstellerName = Column(String(256))
    version_w = Column(String(256))
    timestamp_w = Column(DateTime)
    lid_e = Column(Integer)
    Ergebniscode_e = Column(String(256))
    AufrufVeraltet_e = Column(Boolean)
    AufrufLebenszeitEnde_e = Column(String(256))
    AufrufVersion_e = Column(String(256))
    Meldedatum_e = Column(String(256))
    DatumLetzteAktualisierung_e = Column(String(256))
    EegInbetriebnahmedatum = Column(String(256))
    AnlagenkennzifferAnlagenregister = Column(String(256))
    AnlagenschluesselEeg = Column(String(256))
    PrototypAnlage = Column(String(256))
    PilotAnlage = Column(String(256))
    InstallierteLeistung = Column(String(256))
    VerhaeltnisReferenzertragErtrag5Jahre = Column(String(256))
    VerhaeltnisReferenzertragErtrag10Jahre = Column(String(256))
    VerhaeltnisReferenzertragErtrag15Jahre = Column(String(256))
    AusschreibungZuschlag = Column(String(256))
    Zuschlagsnummer = Column(String(256))
    AnlageBetriebsstatus = Column(String(256))
    VerknuepfteEinheit = Column(String(256))
    version_e = Column(String(256))
    timestamp_e = Column(String(256))
