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

#![allow(unused_imports)]

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

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

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

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid27001MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
    pub referenz: Option<Referenz>,
    pub waehrung: Option<Waehrung>,
}

/// PID 27001: Übermittlung der Ausgleichs-energiepreise
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid27001TransaktionStammdaten {
    /// Required (Muss). Fields: beginnDatum, beginnQualifier, einzelpreisbasisMenge, endeDatum, endeQualifier, preisBetrag, preisQualifier
    pub preis: Option<Preis>,
    /// Required (Muss). Fields: produktgruppenart
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preisgruppe: Option<Vec<Preisgruppe>>,
    /// Required (Muss). Fields: artikelnummertyp, positionsnummer, produktIdentifikation.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preisposition: Option<Vec<Preisposition>>,
}

impl Pid27001TransaktionStammdaten {
    /// Required entity fields for PID 27001 (Übermittlung der Ausgleichs-energiepreise).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("preis", &["beginnDatum", "beginnQualifier", "einzelpreisbasisMenge", "endeDatum", "endeQualifier", "preisBetrag", "preisQualifier"]),
            ("preisgruppe", &["produktgruppenart"]),
            ("preisposition", &["artikelnummertyp", "positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid27001Interchange = crate::model::Interchange<
    Pid27001MessageStammdaten,
    Pid27001TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid27002MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
    pub referenz: Option<Referenz>,
    pub waehrung: Option<Waehrung>,
}

/// PID 27002: Preisblätter MSB-Leistungen
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid27002TransaktionStammdaten {
    /// Required (Muss). Fields: masseinheit, preisBetrag, preisQualifier, untereGrenze, wertebereichMasseinheit, wertebereichQualifier
    pub preis: Option<Preis>,
    /// Required (Muss). Fields: produktgruppenart
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preisgruppe: Option<Vec<Preisgruppe>>,
    /// Required (Muss). Fields: artikelnummertyp, beschreibungsformat, positionsnummer, produktCode, produktIdentifikation.funktion, produktIdentifikation.id, produktIdentifikation.typ, produktKonfiguration
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preisposition: Option<Vec<Preisposition>>,
}

impl Pid27002TransaktionStammdaten {
    /// Required entity fields for PID 27002 (Preisblätter MSB-Leistungen).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("preis", &["masseinheit", "preisBetrag", "preisQualifier", "untereGrenze", "wertebereichMasseinheit", "wertebereichQualifier"]),
            ("preisgruppe", &["produktgruppenart"]),
            ("preisposition", &["artikelnummertyp", "beschreibungsformat", "positionsnummer", "produktCode", "produktIdentifikation.funktion", "produktIdentifikation.id", "produktIdentifikation.typ", "produktKonfiguration"]),
        ]
    }
}

pub type Pid27002Interchange = crate::model::Interchange<
    Pid27002MessageStammdaten,
    Pid27002TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid27003MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
    pub referenz: Option<Referenz>,
    pub waehrung: Option<Waehrung>,
}

/// PID 27003: Preisblätter NB-Leistungen
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid27003TransaktionStammdaten {
    /// Required (Muss). Fields: preisBetrag, preisQualifier, untereGrenze, wertebereichMasseinheit, wertebereichQualifier
    pub preis: Option<Preis>,
    /// Required (Muss). Fields: produktgruppenart
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preisgruppe: Option<Vec<Preisgruppe>>,
    /// Required (Muss). Fields: artikelnummertyp, positionsnummer, produktIdentifikation.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preisposition: Option<Vec<Preisposition>>,
}

impl Pid27003TransaktionStammdaten {
    /// Required entity fields for PID 27003 (Preisblätter NB-Leistungen).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("preis", &["preisBetrag", "preisQualifier", "untereGrenze", "wertebereichMasseinheit", "wertebereichQualifier"]),
            ("preisgruppe", &["produktgruppenart"]),
            ("preisposition", &["artikelnummertyp", "positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid27003Interchange = crate::model::Interchange<
    Pid27003MessageStammdaten,
    Pid27003TransaktionStammdaten,
>;

