use serde::{Deserialize, Serialize};
use crate::documents::activation::{ControlZoneRef, ResourceObjectRef};
use crate::documents::planned_resource_schedule::GridElementCodingScheme;
use crate::types::{
AttrV, AttrVWithScheme, Direction, DocumentId, DocumentVersion, MarketParticipantId,
MarketRoleType, MeasureUnit, Period, TimeInterval, UtcDateTime,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum NcdDocType {
#[serde(rename = "B15")]
NetworkConstraint,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum NcdProcessType {
#[serde(rename = "A14")]
Forecast,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum NcdBusinessType {
#[serde(rename = "A77")]
ProductionDispatchable,
#[serde(rename = "B59")]
NetworkElement,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum NcdStatus {
#[serde(rename = "A07")]
Activated,
#[serde(rename = "A36")]
Planned,
#[serde(rename = "Z06")]
Demand,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NcdDocStatus {
#[serde(rename = "@v")]
pub v: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NetworkConstraintTimeSeries {
#[serde(rename = "TimeSeriesIdentification")]
pub time_series_identification: AttrV<DocumentId>,
#[serde(rename = "BusinessType")]
pub business_type: AttrV<NcdBusinessType>,
#[serde(rename = "Direction")]
pub direction: AttrV<Direction>,
#[serde(rename = "ConnectingArea")]
pub connecting_area: ControlZoneRef,
#[serde(rename = "ResourceObject")]
pub resource_object: ResourceObjectRef,
#[serde(rename = "GridElement")]
pub grid_element: AttrVWithScheme<String, GridElementCodingScheme>,
#[serde(rename = "MeasurementUnit")]
pub measurement_unit: AttrV<MeasureUnit>,
#[serde(rename = "Status", default, skip_serializing_if = "Option::is_none")]
pub status: Option<AttrV<NcdStatus>>,
#[serde(rename = "Period")]
pub period: Period,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "NetworkConstraintDocument")]
pub struct NetworkConstraintDocument {
#[serde(rename = "DocumentIdentification")]
pub document_identification: AttrV<DocumentId>,
#[serde(rename = "DocumentVersion")]
pub document_version: AttrV<DocumentVersion>,
#[serde(rename = "DocumentType")]
pub document_type: AttrV<NcdDocType>,
#[serde(rename = "ProcessType")]
pub process_type: AttrV<NcdProcessType>,
#[serde(rename = "SenderIdentification")]
pub sender_identification: AttrVWithScheme<MarketParticipantId>,
#[serde(rename = "SenderRole")]
pub sender_role: AttrV<MarketRoleType>,
#[serde(rename = "ReceiverIdentification")]
pub receiver_identification: AttrVWithScheme<MarketParticipantId>,
#[serde(rename = "ReceiverRole")]
pub receiver_role: AttrV<MarketRoleType>,
#[serde(rename = "DocumentDateTime")]
pub document_date_time: AttrV<UtcDateTime>,
#[serde(rename = "TimePeriodCovered")]
pub time_period_covered: AttrV<TimeInterval>,
#[serde(rename = "DocStatus", default, skip_serializing_if = "Option::is_none")]
pub doc_status: Option<NcdDocStatus>,
#[serde(
rename = "NetworkConstraintTimeSeries",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub time_series: Vec<NetworkConstraintTimeSeries>,
}