// 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 Pid23001MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 23001: Störungs-meldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid23001TransaktionStammdaten {
    /// Required (Muss). Fields: kommunikation.art, kommunikationsAdresse, kontakt.funktion_code, kontakt.name, partnerrolle, rollencodenummer, rollencodetyp
    pub ansprechpartner: Option<Ansprechpartner>,
    /// Required (Muss). Fields: meldepunktId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: ablesedatumFormat, antwortStatusCode, bearbeitungsDatum, beginnDatum, beginnDatumFormat, begruendungText1, berichtszeitraumFormat, endeDatum, endeDatumFormat, fehlerText1, geplanteFertigstellung, geraeteStatusCode, positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: referenzNummer, referenzQualifier
    pub referenz: Option<Referenz>,
    /// Required (Muss). Fields: dokumententyp, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid23001TransaktionStammdaten {
    /// Required entity fields for PID 23001 (Störungs-meldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("ansprechpartner", &["kommunikation.art", "kommunikationsAdresse", "kontakt.funktion_code", "kontakt.name", "partnerrolle", "rollencodenummer", "rollencodetyp"]),
            ("messlokation", &["meldepunktId"]),
            ("position", &["ablesedatumFormat", "antwortStatusCode", "bearbeitungsDatum", "beginnDatum", "beginnDatumFormat", "begruendungText1", "berichtszeitraumFormat", "endeDatum", "endeDatumFormat", "fehlerText1", "geplanteFertigstellung", "geraeteStatusCode", "positionsnummer"]),
            ("referenz", &["referenzNummer", "referenzQualifier"]),
            ("vorgang", &["dokumententyp", "vorgangsnummer"]),
        ]
    }
}

pub type Pid23001Interchange = crate::model::Interchange<
    Pid23001MessageStammdaten,
    Pid23001TransaktionStammdaten,
>;

