use crate::technology::ErzeugungsArt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "SCREAMING_SNAKE_CASE"))]
pub enum EegGesetz {
Kwkg,
Eeg2000,
Eeg2004,
Eeg2009,
Eeg2012,
Eeg2017,
Eeg2021,
Eeg2023,
}
impl EegGesetz {
pub fn negativpreis_stunden_schwelle(self) -> Option<u32> {
match self {
Self::Kwkg | Self::Eeg2000 | Self::Eeg2004 | Self::Eeg2009 | Self::Eeg2012 => None,
Self::Eeg2017 => Some(6),
Self::Eeg2021 => Some(4),
Self::Eeg2023 => Some(1),
}
}
pub fn negativpreis_stunden_erreicht(self, consecutive_hours: u32) -> bool {
self.negativpreis_stunden_schwelle()
.is_some_and(|t| consecutive_hours >= t)
}
pub fn negativpreis_kw_grenze(self, art: &ErzeugungsArt) -> Option<u32> {
match self {
Self::Kwkg | Self::Eeg2000 | Self::Eeg2004 | Self::Eeg2009 | Self::Eeg2012 => None,
Self::Eeg2017 => {
if art.is_wind() {
Some(3_000)
} else {
Some(500)
}
}
Self::Eeg2021 => Some(500),
Self::Eeg2023 => Some(100),
}
}
pub fn mastr_nichtregistrierung_suspendiert_verguetung(self) -> bool {
match self {
Self::Eeg2023 => false, _ => true,
}
}
pub fn from_inbetriebnahme_year(year: i32) -> Self {
match year {
..=2004 => Self::Eeg2000,
2005..=2008 => Self::Eeg2004,
2009..=2011 => Self::Eeg2009,
2012..=2015 => Self::Eeg2012, 2016..=2020 => Self::Eeg2017, 2021..=2022 => Self::Eeg2021,
_ => Self::Eeg2023,
}
}
pub fn from_db_year(y: i16) -> Result<Self, InvalidEegGesetz> {
match y {
0 => Ok(Self::Kwkg),
1..=2003 => Ok(Self::Eeg2000),
2004..=2008 => Ok(Self::Eeg2004),
2009..=2011 => Ok(Self::Eeg2009),
2012..=2015 => Ok(Self::Eeg2012), 2016..=2020 => Ok(Self::Eeg2017), 2021..=2022 => Ok(Self::Eeg2021),
2023.. => Ok(Self::Eeg2023),
_ => Err(InvalidEegGesetz(y)), }
}
pub fn to_db_year(self) -> i16 {
match self {
Self::Kwkg => 0,
Self::Eeg2000 => 2000,
Self::Eeg2004 => 2004,
Self::Eeg2009 => 2009,
Self::Eeg2012 => 2012,
Self::Eeg2017 => 2017,
Self::Eeg2021 => 2021,
Self::Eeg2023 => 2023,
}
}
}
impl Default for EegGesetz {
fn default() -> Self {
Self::Eeg2023
}
}
#[derive(Debug, thiserror::Error)]
#[error("unknown eeg_gesetz year: {0}")]
pub struct InvalidEegGesetz(pub i16);