// 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;

/// textbezug for PID 55073
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Textbezug {
    /// Profilbeschreibung
    #[serde(rename = "Z01")]
    Profilbeschreibung,
}

/// mengenQualifier for PID 55073
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MengenQualifier {
    /// Anteil A
    #[serde(rename = "Z11")]
    AnteilA,
    /// Anteil B
    #[serde(rename = "Z12")]
    AnteilB,
    /// Anteil C
    #[serde(rename = "Z13")]
    AnteilC,
    /// Anteil D
    #[serde(rename = "Z14")]
    AnteilD,
    /// Bezugstemperatur
    #[serde(rename = "Z15")]
    Bezugstemperatur,
}

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

/// rollencodetyp for PID 55073
#[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,
}

/// produktIdentifikation.funktion for PID 55073
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ProfilDatenFunktion {
    /// Berechnung Tagesmitteltemperatur
    #[serde(rename = "Z01")]
    BerechnungTagesmitteltemperatur,
}

/// produktIdentifikation.typ for PID 55073
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ProfilDatenTyp {
    /// 24h-Mittelwert
    #[serde(rename = "Z03")]
    Code24hMittelwert,
    /// vom Anbieter zur Verfügung gestellte, äquivalente Tagesmitteltemperatur
    #[serde(rename = "Z04")]
    AnbieterVerfuegungGestellteAequivalenteTagesmitteltemperatur,
    /// Äquivalente Tagesmitteltemperatur
    #[serde(rename = "Z05")]
    AequivalenteTagesmitteltemperatur,
}

/// ideQualifier for PID 55073
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum IdeQualifier {
    /// Liste
    #[serde(rename = "Z01")]
    Liste,
    /// Transaktion
    #[serde(rename = "24")]
    Transaktion,
}

/// pruefidentifikator for PID 55073
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Pruefidentifikator {
    /// MaBiS / Übermittlung der Profildefinitionen
    #[serde(rename = "55073")]
    MabisUebermittlungProfildefinitionen,
}

/// merkmal.code for PID 55073
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ZuordnungCode {
    /// Gewerbe allgemein
    #[serde(rename = "Z38")]
    GewerbeAllgemein,
    /// Gewerbe werktags 8 - 18 Uhr
    #[serde(rename = "Z39")]
    GewerbeWerktags818Uhr,
    /// Gewerbe mit starkem bis überwiegendem Verbrauch in den Abendstunden
    #[serde(rename = "Z40")]
    GewerbeStarkemBisUeberwiegendemVerbrauchAbendstunden,
    /// Gewerbe durchlaufend
    #[serde(rename = "Z41")]
    GewerbeDurchlaufend,
    /// Gewerbe Laden/Friseur
    #[serde(rename = "Z42")]
    GewerbeLadenFriseur,
    /// Gewerbe Bäckerei mit Backstube
    #[serde(rename = "Z43")]
    GewerbeBaeckereiBackstube,
    /// Gewerbe Wochenendbetrieb
    #[serde(rename = "Z44")]
    GewerbeWochenendbetrieb,
    /// Landwirtschaftsbetriebe allgemein
    #[serde(rename = "Z45")]
    LandwirtschaftsbetriebeAllgemein,
    /// Landwirtschaftsbetriebe mit Milchwirtschaft/Nebenerwerbs-Tierzucht
    #[serde(rename = "Z46")]
    LandwirtschaftsbetriebeMilchwirtschaftNebenerwerbsTierzucht,
    /// Landwirtschaft ohne Milchvieh
    #[serde(rename = "Z47")]
    LandwirtschaftOhneMilchvieh,
    /// Haushalt
    #[serde(rename = "Z48")]
    Haushalt,
    /// Bandlast
    #[serde(rename = "Z49")]
    Bandlast,
    /// unterbrechbare Verbrauchseinrichtung
    #[serde(rename = "Z50")]
    UnterbrechbareVerbrauchseinrichtung,
    /// Heizwärmespeicher
    #[serde(rename = "Z51")]
    Heizwaermespeicher,
    /// Straßenbeleuchtung
    #[serde(rename = "Z52")]
    Strassenbeleuchtung,
    /// Photovoltaik-Marktlokation
    #[serde(rename = "Z53")]
    PhotovoltaikMarktlokation,
    /// Blockheizkraftwerk
    #[serde(rename = "Z54")]
    Blockheizkraftwerk,
    /// sonstige verbrauchende Marktlokation
    #[serde(rename = "Z55")]
    SonstigeVerbrauchendeMarktlokation,
    /// sonstige erzeugende Marktlokation
    #[serde(rename = "Z56")]
    SonstigeErzeugendeMarktlokation,
    /// Profilschar
    #[serde(rename = "Z12")]
    Profilschar,
    /// synthetisches Verfahren
    #[serde(rename = "E01")]
    SynthetischesVerfahren,
    /// analytisches Verfahren
    #[serde(rename = "Z10")]
    AnalytischesVerfahren,
    /// 1.000.000 kWh/a
    #[serde(rename = "Z35")]
    Code1000000KwhA,
    /// 300 kWh/K
    #[serde(rename = "Z36")]
    Code300KwhK,
    /// 1.000.000 kW
    #[serde(rename = "Z37")]
    Code1000000Kw,
    /// 0
    #[serde(rename = "Z61")]
    Code0,
    /// 1
    #[serde(rename = "Z62")]
    Code1,
}

/// merkmal.klasse for PID 55073
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ZuordnungKlasse {
    /// Profiltyp
    #[serde(rename = "Z07")]
    Profiltyp,
    /// tagesparameterabhängiges Lastprofil
    #[serde(rename = "Z03")]
    TagesparameterabhaengigesLastprofil,
    /// tagesparameterabhängiges Einspeiseprofil
    #[serde(rename = "Z05")]
    TagesparameterabhaengigesEinspeiseprofil,
    /// Normierungsfaktor
    #[serde(rename = "Z06")]
    Normierungsfaktor,
    /// Begrenzungskonstante
    #[serde(rename = "Z11")]
    Begrenzungskonstante,
    /// Messstelle des Tagesparameters (derzeit ist nur die Temperatur ein erlaubter ...
    #[serde(rename = "Z99")]
    MessstelleTagesparametersDerzeitTemperaturErlaubterTagesparameter,
    /// Klimazone des Tagesparameters (derzeit ist Tagesparameter)
    #[serde(rename = "ZA0")]
    KlimazoneTagesparametersDerzeitTagesparameter,
    /// Bilanzierungsgebiet
    #[serde(rename = "Z20")]
    Bilanzierungsgebiet,
}

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

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProfilDatenProduktIdentifikation {
    /// Required (X). (an..3)
    pub funktion: Option<ProfilDatenFunktion>,
    /// Required (Muss [267] ∧ [303]). ()
    pub id: Option<String>,
    /// Required (X). (an..3)
    pub typ: Option<ProfilDatenTyp>,
}

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

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReferenzprofilZeitscheibe {
    /// Optional. (an..10)
    pub referenz: Option<String>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ZuordnungMerkmal {
    /// Required (X). (an..17)
    pub code: Option<ZuordnungCode>,
    /// Required (unknown). ()
    pub code_codepflege: Option<String>,
    /// Required (unknown). ()
    pub codeliste: Option<String>,
    /// Required (unknown). ()
    pub dimension: Option<String>,
    /// Required (X). (an..3)
    pub klasse: Option<ZuordnungKlasse>,
    /// Required (X). (an..3)
    pub qualifier: Option<ZuordnungQualifier>,
}

/// 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"),
        }
    }
}

/// Freitext for PID 55073 — Übermittlung der Profildefinitionen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Freitext {
    /// Required (X). (an..512)
    pub text: Option<String>,
    /// Required (unknown). ()
    pub text_referenz: Option<String>,
    /// Optional. (an..512)
    pub text_zeile2: Option<String>,
    /// Optional. (an..512)
    pub text_zeile3: Option<String>,
    /// Optional. (an..512)
    pub text_zeile4: Option<String>,
    /// Optional. (an..512)
    pub text_zeile5: Option<String>,
    /// Required (X). (an..3)
    pub textbezug: Option<Textbezug>,
    /// Required (unknown). ()
    pub textfunktion: Option<String>,
}

/// MarktlokationMengen for PID 55073 — Übermittlung der Profildefinitionen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct MarktlokationMengen {
    /// Required (X [902] ∧ [930]). (an..35)
    pub menge: Option<String>,
    /// Required (X). (an..3)
    pub mengen_qualifier: Option<MengenQualifier>,
    /// Required (unknown). ()
    pub mengeneinheit: Option<String>,
}

/// Marktteilnehmer for PID 55073 — Übermittlung der Profildefinitionen.
#[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 55073 — Übermittlung der Profildefinitionen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Nachricht {
    /// Required (X [931] [494]). (an..35)
    pub erstellungsdatum: Option<String>,
    /// Optional. ()
    pub nachrichtennummer: Option<String>,
    /// Optional. ()
    pub nachrichtentyp: Option<String>,
}

/// ProfilDaten for PID 55073 — Übermittlung der Profildefinitionen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct ProfilDaten {
    pub produkt_identifikation: Option<ProfilDatenProduktIdentifikation>,
    pub zeitscheibe: Option<ProfilDatenZeitscheibe>,
}

/// Prozessdaten for PID 55073 — Übermittlung der Profildefinitionen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Prozessdaten {
    /// Required (X). (an..3)
    pub ide_qualifier: Option<IdeQualifier>,
    /// Required (X). (an..70)
    pub pruefidentifikator: Option<Pruefidentifikator>,
    /// Required (X). (an..35)
    pub vorgang_id: Option<String>,
}

/// Referenzprofil for PID 55073 — Übermittlung der Profildefinitionen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Referenzprofil {
    pub zeitscheibe: Option<ReferenzprofilZeitscheibe>,
}

/// Zuordnung for PID 55073 — Übermittlung der Profildefinitionen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Zuordnung {
    pub merkmal: Option<ZuordnungMerkmal>,
}

/// PID 55073 transaction — Übermittlung der Profildefinitionen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Transaktion {
    pub freitext: Option<Freitext>,
    pub marktlokation_mengen: Option<MarktlokationMengen>,
    /// Required (Muss [267] ∧ [303]).
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub profil_daten: Option<Vec<ProfilDaten>>,
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss [302] ∧ [303]).
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub referenzprofil: Option<Vec<Referenzprofil>>,
    pub zuordnung: Option<Zuordnung>,
}

/// PID 55073 message-level — Übermittlung der Profildefinitionen.
#[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 55073 — Übermittlung der Profildefinitionen.
pub type Interchange = crate::model::Interchange<Message, Transaktion>;
