// Auto-generated by automapper-generator. Do not edit.

#![allow(dead_code, unused_imports, non_camel_case_types)]

use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;

/// abrechnungsmethode for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Abrechnungsmethode {
    /// Zugeordneter Marktpartner
    #[serde(rename = "ZB3")]
    ZugeordneterMarktpartner,
}

/// bilanzierungsgebiet for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Bilanzierungsgebiet {
    /// Zugeordneter Marktpartner
    #[serde(rename = "ZB3")]
    ZugeordneterMarktpartner,
}

/// bilanzkreis for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Bilanzkreis {
    /// Zugeordneter Marktpartner
    #[serde(rename = "ZB3")]
    ZugeordneterMarktpartner,
}

/// regelzone for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Regelzone {
    /// Zugeordneter Marktpartner
    #[serde(rename = "ZB3")]
    ZugeordneterMarktpartner,
}

/// zeitreihenCode for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ZeitreihenCode {
    /// ÜNB
    #[serde(rename = "Z90")]
    Uenb,
}

/// zeitreihentyp for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Zeitreihentyp {
    /// Zugeordneter Marktpartner
    #[serde(rename = "ZB3")]
    ZugeordneterMarktpartner,
}

/// mengenQualifier for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MengenQualifier {
    /// Veranschlagte Jahresmenge Gesamt/Jahresverbrauchsprognose für spezifische Arb...
    #[serde(rename = "265")]
    VeranschlagteJahresmengeGesamtJahresverbrauchsprognoseSpezifischeArbeit,
    /// Angepasste elektrische Arbeit nach Anhang D der VDN-Richtlinie "Lastprofile f...
    #[serde(rename = "Z08")]
    AngepassteElektrischeArbeitAnhangDVdnRichtlinieLastprofileUnterbrechbare,
}

/// mengeneinheit for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Mengeneinheit {
    /// kWh/K (Kilowatt-Stunde/Kelvin)
    #[serde(rename = "Z16")]
    KwhKKilowattStundeKelvin,
    /// Kilowattstunde
    #[serde(rename = "KWH")]
    Kilowattstunde,
}

/// marktrolle for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Marktrolle {
    /// Dokumenten-/Nachrichtenaussteller bzw. -absender
    #[serde(rename = "MS")]
    DokumentenNachrichtenausstellerAbsender,
}

/// rollencodetyp for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Rollencodetyp {
    /// GS1
    #[serde(rename = "9")]
    Gs1,
    /// DE, BDEW (Bundesverband der Energie- und Wasserwirtschaft e.V.)
    #[serde(rename = "293")]
    DeBdewBundesverbandEnergieWasserwirtschaftEV,
}

/// standardlastprofil for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Standardlastprofil {
    /// Dieser Code ist in der Anwendung durch einen zulässigen Code aus der vom NB g...
    #[serde(rename = "XYZ")]
    DieserCodeAnwendungDurchZulaessigenCodeNbGueltigenListe,
}

/// standardlastprofilVerfahren for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum StandardlastprofilVerfahren {
    /// synthetisches Verfahren
    #[serde(rename = "E01")]
    SynthetischesVerfahren,
    /// analytisches Verfahren
    #[serde(rename = "Z10")]
    AnalytischesVerfahren,
}

/// tagesparameterProfil for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum TagesparameterProfil {
    /// Dieser Code ist in der Anwendung durch einen zulässigen Code aus der vom NB g...
    #[serde(rename = "XYZ")]
    DieserCodeAnwendungDurchZulaessigenCodeNbGueltigenListe,
}

/// tagesparameterVerfahren for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum TagesparameterVerfahren {
    /// Profilschar
    #[serde(rename = "Z12")]
    Profilschar,
}

/// pruefidentifikator for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Pruefidentifikator {
    /// GPKE / Abrechnungsdaten Bilanzkreisabrechnung verbrauchender MaLo an LF
    #[serde(rename = "55126")]
    GpkeAbrechnungsdatenBilanzkreisabrechnungVerbrauchenderMaloLf,
}

/// transaktionsgrund for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Transaktionsgrund {
    /// Abrechnungsdaten BK-Abrechnung verbrauchender MaLo
    #[serde(rename = "ZX3")]
    AbrechnungsdatenBkAbrechnungVerbrauchenderMalo,
    /// Korrektur Abrechnungsdaten BK-Abrechnung verbrauchender MaLo
    #[serde(rename = "ZAN")]
    KorrekturAbrechnungsdatenBkAbrechnungVerbrauchenderMalo,
}

/// transaktionsgrundErgaenzung for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum TransaktionsgrundErgaenzung {
    /// Der LFN wird einer Marktlokation vollständig zugeordnet (vollständige (100%ig...
    #[serde(rename = "ZW0")]
    LfnMarktlokationVollstaendigZugeordnetVollstaendige100IgeZuordnungDieser,
    /// Der LFN wird einer bestehenden Tranche vollständig zugeordnet (vollständige (...
    #[serde(rename = "ZW1")]
    LfnBestehendenTrancheVollstaendigZugeordnetVollstaendige100IgeZuordnung,
    /// Der LFN wird einer neu zu bildenden Tranche zugeordnet (anteiliger Zuordnungs...
    #[serde(rename = "ZW2")]
    LfnNeuBildendenTrancheZugeordnetAnteiligerZuordnungsvorgangBildungNeuer,
    /// Erzeugende Marktlokation
    #[serde(rename = "ZW3")]
    ErzeugendeMarktlokation,
    /// Verbrauchende Marktlokation
    #[serde(rename = "ZW4")]
    VerbrauchendeMarktlokation,
    /// Tranche
    #[serde(rename = "ZW5")]
    Tranche,
    /// Pauschale Marktlokation
    #[serde(rename = "ZW6")]
    PauschaleMarktlokation,
    /// Gemessene Marktlokation
    #[serde(rename = "ZW7")]
    GemesseneMarktlokation,
    /// Fall 1
    #[serde(rename = "ZW8")]
    Fall1,
    /// Fall 2
    #[serde(rename = "ZW9")]
    Fall2,
    /// Fall 3
    #[serde(rename = "ZX0")]
    Fall3,
    /// Fall 4
    #[serde(rename = "ZX1")]
    Fall4,
    /// ruhende Marktlokation
    #[serde(rename = "ZAP")]
    RuhendeMarktlokation,
    /// Die Stilllegung der MeLo hat auch die Stilllegung einer MaLo zur Folge
    #[serde(rename = "ZZB")]
    StilllegungMeloStilllegungMaloFolgeDieserCodeErst142026GueltigDavor,
    /// Die Stilllegung der MeLo hat keine Stilllegung einer MaLo zur Folge
    #[serde(rename = "ZZC")]
    StilllegungMeloKeineStilllegungMaloFolgeDieserCodeErst142026Gueltig,
}

/// transaktionsgrundErgaenzungBefristeteAnmeldung for PID 55126
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum TransaktionsgrundErgaenzungBefristeteAnmeldung {
    /// Kunde verlässt eine schon bestehende Marktlokation
    #[serde(rename = "E01")]
    KundeVerlaesstBestehendeMarktlokation,
    /// - Kunde bleibt an der Marktlokation, hat nur den Marktpartner gewechselt - Ma...
    #[serde(rename = "E03")]
    KundeBleibtMarktlokationMarktpartnerGewechseltMarktpartnerKunden,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MarktlokationZeitscheibe {
    /// Required (X [914] ∧ [937] [22]). (an..10)
    pub referenz: Option<String>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProfilDatenZeitscheibe {
    /// Required (X [914] ∧ [937] [22]). (an..10)
    pub referenz: Option<String>,
}

/// Map key for Marktteilnehmer instances.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum MarktteilnehmerKey {
    /// Dokumenten-/Nachrichtenaussteller bzw. -absender
    #[serde(rename = "MS")]
    Ms,
    /// Nachrichtenempfänger
    #[serde(rename = "MR")]
    Mr,
}

impl std::fmt::Display for MarktteilnehmerKey {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Ms => write!(f, "MS"),
            Self::Mr => write!(f, "MR"),
        }
    }
}

/// Marktlokation for PID 55126 — Abr.-Daten BK-Abr. verb. Malo.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Marktlokation {
    /// Required (X). (an..17)
    pub abrechnungsmethode: Option<Abrechnungsmethode>,
    /// Required (X). (an..17)
    pub bilanzierungsgebiet: Option<Bilanzierungsgebiet>,
    /// Required (X). (an..17)
    pub bilanzkreis: Option<Bilanzkreis>,
    /// Required (X). ()
    pub codeliste_code: Option<String>,
    /// Required (X). ()
    pub codepflege_code: Option<String>,
    /// Required (X). (an..256)
    pub lokation_zeitraum_id: Option<String>,
    /// Required (X [950]). (an..35)
    pub marktlokations_id: Option<String>,
    /// Required (X [1P1..n]). ()
    pub marktlokations_id_ref: Option<String>,
    /// Required (X). (an..17)
    pub regelzone: Option<Regelzone>,
    /// Required (X). (an..3)
    pub zeitreihen_code: Option<ZeitreihenCode>,
    /// Required (X). (an..17)
    pub zeitreihentyp: Option<Zeitreihentyp>,
    pub zeitscheibe: Option<MarktlokationZeitscheibe>,
}

/// MarktlokationMengen for PID 55126 — Abr.-Daten BK-Abr. verb. Malo.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct MarktlokationMengen {
    /// Required (X [902]). (an..35)
    pub menge: Option<String>,
    /// Required (X). (an..3)
    pub mengen_qualifier: Option<MengenQualifier>,
    /// Required (X [103]). (an..8)
    pub mengeneinheit: Option<Mengeneinheit>,
}

/// Marktteilnehmer for PID 55126 — Abr.-Daten BK-Abr. verb. Malo.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Marktteilnehmer {
    /// Required (unknown). ()
    pub codeliste_code: Option<String>,
    /// Required (X). (an..3)
    pub marktrolle: Option<Marktrolle>,
    /// Required (X). (an..35)
    pub rollencodenummer: Option<String>,
    /// Required (X). (an..3)
    pub rollencodetyp: Option<Rollencodetyp>,
}

/// Nachricht for PID 55126 — Abr.-Daten BK-Abr. verb. Malo.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Nachricht {
    /// Optional. (an..35)
    pub erstellungsdatum: Option<String>,
    /// Optional. ()
    pub nachrichtennummer: Option<String>,
    /// Optional. ()
    pub nachrichtentyp: Option<String>,
}

/// ProfilDaten for PID 55126 — Abr.-Daten BK-Abr. verb. Malo.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct ProfilDaten {
    /// Required (X). (an..3)
    pub standardlastprofil: Option<Standardlastprofil>,
    /// Required (X). (an..17)
    pub standardlastprofil_verfahren: Option<StandardlastprofilVerfahren>,
    /// Required (X). (an..3)
    pub tagesparameter_profil: Option<TagesparameterProfil>,
    /// Required (X). (an..17)
    pub tagesparameter_verfahren: Option<TagesparameterVerfahren>,
    /// Required (X [914] ∧ [937] [22]). (an..10)
    pub z08_zeitscheibe_ref: Option<String>,
    pub zeitscheibe: Option<ProfilDatenZeitscheibe>,
}

/// Prozessdaten for PID 55126 — Abr.-Daten BK-Abr. verb. Malo.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Prozessdaten {
    /// Required (X). (an..70)
    pub pruefidentifikator: Option<Pruefidentifikator>,
    /// Required (X). (an..3)
    pub transaktionsgrund: Option<Transaktionsgrund>,
    /// Optional. (an..3)
    pub transaktionsgrund_ergaenzung: Option<TransaktionsgrundErgaenzung>,
    /// Optional. (an..3)
    pub transaktionsgrund_ergaenzung_befristete_anmeldung: Option<TransaktionsgrundErgaenzungBefristeteAnmeldung>,
    /// Required (X). (an..35)
    pub vorgang_id: Option<String>,
}

/// PID 55126 transaction — Abr.-Daten BK-Abr. verb. Malo.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Transaktion {
    /// Required (X).
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub marktlokation: Option<Vec<Marktlokation>>,
    pub marktlokation_mengen: Option<MarktlokationMengen>,
    /// Required (X).
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub profil_daten: Option<Vec<ProfilDaten>>,
    pub prozessdaten: Option<Prozessdaten>,
}

/// PID 55126 message-level — Abr.-Daten BK-Abr. verb. Malo.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Message {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, Marktteilnehmer>>,
    pub nachricht: Option<Nachricht>,
}

/// Complete interchange for PID 55126 — Abr.-Daten BK-Abr. verb. Malo.
pub type Interchange = crate::model::Interchange<Message, Transaktion>;
