use swiss_eph::safe::{self, RiseTransFlags, Planet, GeoPos};
pub fn calculate_sunrise(year: i32, month: u32, day: u32, lat: f64, lon: f64, altitude: f64) -> f64 {
let jd_start = safe::julday(year, month as i32, day as i32, 0.0);
let flags = RiseTransFlags::new().with_rise();
let geopos = GeoPos { longitude: lon, latitude: lat, altitude };
match safe::rise_trans(jd_start, Planet::Sun, None, geopos, flags) {
Ok(jd_rise) => jd_to_unix_ms(jd_rise),
Err(_) => {
let jd_fallback = safe::julday(year, month as i32, day as i32, 6.0);
jd_to_unix_ms(jd_fallback)
}
}
}
pub fn calculate_sunset(year: i32, month: u32, day: u32, lat: f64, lon: f64, altitude: f64) -> f64 {
let jd_start = safe::julday(year, month as i32, day as i32, 12.0);
let flags = RiseTransFlags::new().with_set();
let geopos = GeoPos { longitude: lon, latitude: lat, altitude };
match safe::rise_trans(jd_start, Planet::Sun, None, geopos, flags) {
Ok(jd_set) => jd_to_unix_ms(jd_set),
Err(_) => {
let jd_fallback = safe::julday(year, month as i32, day as i32, 18.0);
jd_to_unix_ms(jd_fallback)
}
}
}
fn jd_to_unix_ms(jd: f64) -> f64 {
(jd - 2440587.5) * 86400000.0
}
pub fn unix_ms_to_jd(unix_ms: f64) -> f64 {
unix_ms / 86400000.0 + 2440587.5
}