use serde::{Deserialize, Serialize};
use crate::documents::activation::EicCodingScheme;
use crate::types::{Decimal3, 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 KaskadeStatus {
#[serde(rename = "A07")]
Activated,
#[serde(rename = "A10")]
Ordered,
#[serde(rename = "A16")]
Deactivation,
#[serde(rename = "A35")]
Preliminary,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum KaskadeType {
#[serde(rename = "Z16")]
EmergencyMeasures,
#[serde(rename = "Z17")]
TestMessage,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum KaskadeRoleType {
#[serde(rename = "A18")]
GridOperator,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum KaskadeBusinessType {
#[serde(rename = "A01")]
Production,
#[serde(rename = "A04")]
Consumption,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum CurveType {
#[serde(rename = "A03")]
VariableSizedBlock,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum KaskadeMeasureUnit {
#[serde(rename = "MAW")]
Megawatt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum KaskadeReasonCode {
#[serde(rename = "Z19")]
LocalGridProblem,
#[serde(rename = "Z20")]
SystemBalanceProblem,
}
pub type ParticipantMrid = SimpleContent<String>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct KaskadeMarketRole {
#[serde(rename = "type")]
pub role_type: KaskadeRoleType,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct KaskadeParticipant {
#[serde(rename = "mRID")]
pub m_rid: ParticipantMrid,
#[serde(rename = "marketRole")]
pub market_role: KaskadeMarketRole,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StatusElement {
pub value: KaskadeStatus,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct KaskadeTimeInterval {
#[serde(rename = "start", default, skip_serializing_if = "Option::is_none")]
pub start: Option<UtcMinuteDateTime>,
pub end: UtcMinuteDateTime,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AvailablePeriod {
#[serde(rename = "timeInterval")]
pub time_interval: KaskadeTimeInterval,
#[serde(
rename = "resolution",
default,
skip_serializing_if = "Option::is_none"
)]
pub resolution: Option<String>,
#[serde(rename = "Point", default, skip_serializing_if = "Vec::is_empty")]
pub points: Vec<KaskadePoint>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct KaskadePoint {
pub position: u32,
pub quantity: Decimal3,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct KaskadeReason {
pub code: KaskadeReasonCode,
#[serde(
rename = "ReasonText",
default,
skip_serializing_if = "Option::is_none"
)]
pub reason_text: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ResourceObjScheme {
#[serde(rename = "A01")]
Eic,
#[serde(rename = "A02")]
NationalResource,
#[serde(rename = "NDE")]
Nde,
#[serde(rename = "Z01")]
Other,
}
pub type ResourceObjectRef = SimpleContent<String, ResourceObjScheme>;
pub type BiddingZoneMrid = SimpleContent<String, EicCodingScheme>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BiddingZoneDomain {
#[serde(rename = "mRID")]
pub m_rid: BiddingZoneMrid,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct QuantityMeasureUnit {
pub name: KaskadeMeasureUnit,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct KaskadeTimeSeries {
#[serde(rename = "mRID")]
pub m_rid: Mrid,
#[serde(
rename = "senders_document_mRID",
default,
skip_serializing_if = "Option::is_none"
)]
pub senders_document_m_rid: Option<Mrid>,
#[serde(
rename = "senders_revisionNumber",
default,
skip_serializing_if = "Option::is_none"
)]
pub senders_revision_number: Option<RevisionNumber>,
#[serde(
rename = "senders_createdDateTime",
default,
skip_serializing_if = "Option::is_none"
)]
pub senders_created_date_time: Option<UtcDateTime>,
#[serde(rename = "businessType")]
pub business_type: KaskadeBusinessType,
#[serde(
rename = "ResourceObject",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub resource_objects: Vec<ResourceObjectRef>,
#[serde(rename = "biddingZone_Domain")]
pub bidding_zone_domain: BiddingZoneDomain,
#[serde(rename = "quantity_Measure_Unit")]
pub quantity_measure_unit: QuantityMeasureUnit,
#[serde(rename = "curveType")]
pub curve_type: CurveType,
#[serde(rename = "Available_Period")]
pub available_period: AvailablePeriod,
#[serde(rename = "Reason")]
pub reason: KaskadeReason,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "Kaskade")]
pub struct Kaskade {
#[serde(rename = "createdDateTime")]
pub created_date_time: UtcDateTime,
#[serde(rename = "mRID")]
pub m_rid: Mrid,
#[serde(rename = "revisionNumber")]
pub revision_number: RevisionNumber,
pub status: StatusElement,
#[serde(rename = "type")]
pub doc_type: KaskadeType,
#[serde(rename = "sender_MarketParticipant")]
pub sender_market_participant: KaskadeParticipant,
#[serde(rename = "receiver_MarketParticipant")]
pub receiver_market_participant: KaskadeParticipant,
#[serde(rename = "TimeSeries")]
pub time_series: KaskadeTimeSeries,
}