use crate::{Endpoint, LDateTime, types::*};
use chrono::Local;
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Lesson {
pub uid: String,
pub datum: LDateTime,
pub kezdet_idopont: LDateTime,
pub veg_idopont: LDateTime,
pub nev: String,
pub oraszam: Option<u8>,
pub ora_eves_sorszama: Option<u32>,
pub osztaly_csoport: Option<Uid>,
pub tanar_neve: Option<String>,
pub tantargy: Option<Tantargy>,
pub tema: Option<String>,
pub terem_neve: Option<String>,
pub tipus: Rektip,
pub tanulo_jelenlet: Option<Rektip>,
pub allapot: Option<Rektip>,
pub helyettes_tanar_neve: Option<String>,
pub hazi_feladat_uid: Option<String>,
pub feladat_group_uid: Option<String>,
pub nyelvi_feladat_group_uid: Option<String>,
pub bejelentett_szamonkeres_uid: Option<String>,
pub is_tanulo_hazi_feladat_enabled: bool,
pub is_hazi_feladat_megoldva: bool,
pub csatolmanyok: Vec<String>,
pub is_digitalis_ora: bool,
pub digitalis_eszkoz_tipus: Option<String>,
pub digitalis_platform_tipus: Option<String>,
pub digitalis_tamogato_eszkoz_tipus_list: Option<Vec<String>>,
pub letrehozas: String,
pub utolso_modositas: chrono::NaiveDateTime,
}
impl Lesson {
pub fn date_naive(&self) -> chrono::NaiveDate {
self.kezdet_idopont.date_naive()
}
pub fn mins_till_start(&self) -> i64 {
(self.kezdet_idopont - Local::now()).num_minutes()
}
pub fn mins_till_end(&self) -> i64 {
(self.veg_idopont - Local::now()).num_minutes()
}
pub fn normalised_room(&self) -> String {
if let Some(room) = self.terem_neve.clone() {
room.replace("terem", "").trim().to_string()
} else {
String::new()
}
}
pub fn same_time(&self, other: &Self) -> bool {
self.kezdet_idopont == other.kezdet_idopont && self.veg_idopont == other.veg_idopont
}
pub fn cancelled(&self) -> bool {
self.allapot.as_ref().is_some_and(|a| a.nev == "Elmaradt")
}
pub fn absent(&self) -> bool {
self.tanulo_jelenlet
.as_ref()
.is_some_and(|absence| absence.nev == "Hianyzas")
}
pub fn subject_id(&self) -> Option<&String> {
self.tantargy.as_ref().map(|tt| &tt.kategoria.nev)
}
pub fn kamu_smafu(&self) -> bool {
self.kezdet_idopont
.signed_duration_since(self.veg_idopont)
.is_zero()
}
pub fn happening(&self) -> bool {
if self.cancelled() {
return false;
}
self.kezdet_idopont <= Local::now() && self.veg_idopont >= Local::now()
}
pub fn forecoming(&self) -> bool {
self.kezdet_idopont > Local::now()
}
pub fn d_num(&self) -> u8 {
self.oraszam.unwrap_or(u8::MAX)
}
}
impl Endpoint for Lesson {
type Args = (chrono::NaiveDate, chrono::NaiveDate);
fn path(_args: &Self::Args) -> String {
"/ellenorzo/V3/Sajat/OrarendElemek".into()
}
fn query(input: Self::Args) -> Vec<(&'static str, String)> {
let from = input.0.and_hms_opt(0, 0, 0).unwrap().to_string();
let to = input.1.and_hms_opt(23, 59, 59).unwrap().to_string();
vec![("datumTol", from), ("datumIg", to)]
}
fn when(&self) -> Option<crate::LDateTime> {
Some(self.kezdet_idopont)
}
}