use chrono::prelude::*;
use std::collections::HashMap;
pub use open_notify::DayTime;
use crate::level::Level;
pub fn new_properties<'a>() -> HashMap<&'a str, String> {
let mut props: HashMap<&str, String> = HashMap::new();
get_spots(
&mut props,
&Vec::new(),
0,
true,
None,
false,
&Level::RISE,
);
return props;
}
pub fn get_spots(
props: &mut HashMap<&str, String>,
spots: &Vec<open_notify::Spot>,
soon_mins: i64,
visible: bool,
daytime: Option<&DayTime>,
blink: bool,
level: &Level,
) -> Level {
let satellite = "🛰".to_string();
let eye = "👁".to_string();
let empty = "".to_string();
let current = open_notify::find_current(spots, daytime, chrono::Local::now());
let upcoming = open_notify::find_upcoming(spots, daytime, chrono::Local::now());
if visible {
match current {
Some(spot) => {
props.insert("{iss_space}", " ".to_string());
props.insert(
"{iss_icon}",
match blink {
false => satellite.clone(),
true => eye.clone(),
},
);
let duration = Local::now() - spot.risetime;
let duration = format!(
"+{:02}:{:02}:{:02}",
duration.num_hours(),
duration.num_minutes() % 60,
duration.num_seconds() % 60
)
.replace("00:", "");
props.insert("{iss}", duration);
return Level::WATCH;
}
None => match upcoming {
Some(spot) => {
let duration = spot.risetime - Local::now();
if duration < chrono::Duration::minutes(soon_mins)
&& [Level::SOON, Level::RISE, Level::FAR].contains(&level)
{
props.insert("{iss_space}", " ".to_string());
props.insert("{iss_icon}", satellite.clone());
let duration = format!(
"-{:02}:{:02}:{:02}",
duration.num_hours(),
duration.num_minutes() % 60,
duration.num_seconds() % 60
)
.replace("00:", "");
props.insert("{iss}", duration);
return Level::SOON;
} else if [Level::RISE, Level::FAR].contains(&level) {
props.insert("{iss_space}", " ".to_string());
props.insert("{iss_icon}", satellite.clone());
if duration > chrono::Duration::days(2) {
props.insert("{iss}", format!("{}d", duration.num_days()));
} else if duration > chrono::Duration::days(1) {
props.insert("{iss}", format!("{}h", duration.num_hours()));
} else {
props.insert("{iss}", spot.risetime.format("%R").to_string());
}
return Level::RISE;
}
}
None => {
if level == &Level::FAR {
match spots.last() {
Some(spot) => {
props.insert("{iss_space}", " ".to_string());
let duration = spot.risetime - Local::now();
props.insert("{iss_icon}", satellite.clone());
props.insert("{iss}", format!(">{}", duration.num_days()));
return Level::FAR;
}
_ => ()
}
}
},
},
}
}
props.insert("{iss_icon}", empty.clone());
props.insert("{iss}", empty.clone());
return Level::NONE;
}