use serde::{Deserialize, Serialize};
use crate::documents::activation::EicCodingScheme;
use crate::documents::kaskade::ParticipantMrid;
use crate::types::{Mrid, RevisionNumber, SimpleContent, UtcDateTime, UtcMinuteDateTime};
pub const NAMESPACE: &str = "urn:iec62325.351:tc57wg16:451-6:outagedocument:3:0";
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum UnavailabilityDocType {
#[serde(rename = "A67")]
PlannedUnavailability,
#[serde(rename = "A76")]
ForcedUnavailability,
#[serde(rename = "A80")]
ProductionUnavailability,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum UnavailabilityProcessType {
#[serde(rename = "A14")]
Forecast,
#[serde(rename = "A26")]
OutageInfo,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum UnavailabilityBusinessType {
#[serde(rename = "A01")]
Production,
#[serde(rename = "A53")]
PlannedMaintenance,
#[serde(rename = "A54")]
UnplannedOutage,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum UnavailabilitySenderRole {
#[serde(rename = "A27")]
ResourceProvider,
#[serde(rename = "A39")]
DataProvider,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum UnavailabilityReceiverRole {
#[serde(rename = "A18")]
GridOperator,
#[serde(rename = "A39")]
DataProvider,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum UnavailabilityMarketRoleType {
#[serde(rename = "A18")]
GridOperator,
#[serde(rename = "A27")]
ResourceProvider,
#[serde(rename = "A39")]
DataProvider,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnavailabilityMarketRole {
#[serde(rename = "type")]
pub role_type: UnavailabilityMarketRoleType,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnavailabilityParticipant {
#[serde(rename = "mRID")]
pub m_rid: ParticipantMrid,
#[serde(rename = "marketRole")]
pub market_role: UnavailabilityMarketRole,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnavailabilityTimeInterval {
pub start: UtcMinuteDateTime,
pub end: UtcMinuteDateTime,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnavailabilityTimePeriod {
#[serde(rename = "timeInterval")]
pub time_interval: UnavailabilityTimeInterval,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DocStatus {
pub value: String,
}
pub type UnavailabilityBiddingZone = SimpleContent<String, EicCodingScheme>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnavailabilityBiddingZoneDomain {
#[serde(rename = "mRID")]
pub m_rid: UnavailabilityBiddingZone,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnavailabilityTimeSeries {
#[serde(rename = "mRID")]
pub m_rid: Mrid,
#[serde(
rename = "original_sender_MarketParticipant.mRID",
default,
skip_serializing_if = "Option::is_none"
)]
pub original_sender_m_rid: Option<ParticipantMrid>,
#[serde(
rename = "original_document_mRID",
default,
skip_serializing_if = "Option::is_none"
)]
pub original_document_m_rid: Option<Mrid>,
#[serde(
rename = "original_revisionNumber",
default,
skip_serializing_if = "Option::is_none"
)]
pub original_revision_number: Option<RevisionNumber>,
#[serde(
rename = "original_createdDateTime",
default,
skip_serializing_if = "Option::is_none"
)]
pub original_created_date_time: Option<UtcDateTime>,
#[serde(
rename = "original_timeseries_mRID",
default,
skip_serializing_if = "Option::is_none"
)]
pub original_timeseries_m_rid: Option<Mrid>,
#[serde(rename = "businessType")]
pub business_type: UnavailabilityBusinessType,
#[serde(rename = "biddingZone_Domain")]
pub bidding_zone_domain: UnavailabilityBiddingZoneDomain,
#[serde(rename = "start_DateAndOrTime.date")]
pub start_date: String,
#[serde(rename = "start_DateAndOrTime.time")]
pub start_time: String,
#[serde(rename = "end_DateAndOrTime.date")]
pub end_date: String,
#[serde(rename = "end_DateAndOrTime.time")]
pub end_time: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "Unavailability_MarketDocument")]
pub struct UnavailabilityMarketDocument {
#[serde(rename = "mRID")]
pub m_rid: Mrid,
#[serde(rename = "revisionNumber")]
pub revision_number: RevisionNumber,
#[serde(rename = "type")]
pub doc_type: UnavailabilityDocType,
#[serde(rename = "process.processType")]
pub process_type: UnavailabilityProcessType,
#[serde(rename = "createdDateTime")]
pub created_date_time: UtcDateTime,
#[serde(rename = "sender_MarketParticipant")]
pub sender_market_participant: UnavailabilityParticipant,
#[serde(rename = "receiver_MarketParticipant")]
pub receiver_market_participant: UnavailabilityParticipant,
#[serde(rename = "unavailability_Time_Period")]
pub unavailability_time_period: UnavailabilityTimePeriod,
#[serde(rename = "docStatus", default, skip_serializing_if = "Option::is_none")]
pub doc_status: Option<DocStatus>,
#[serde(rename = "TimeSeries", default, skip_serializing_if = "Vec::is_empty")]
pub time_series: Vec<UnavailabilityTimeSeries>,
}