use std::collections::HashMap;
use lox_time::intervals::TimeInterval;
use lox_time::time_scales::Tai;
use crate::assets::AssetId;
use crate::imaging::aoi::AoiId;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PassDirection {
Ascending,
Descending,
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AccessWindow {
pub interval: TimeInterval<Tai>,
pub direction: PassDirection,
}
type WindowMap = HashMap<(AssetId, AoiId), Vec<AccessWindow>>;
pub struct AccessResults {
windows: WindowMap,
}
impl AccessResults {
pub(super) fn new(windows: WindowMap) -> Self {
Self { windows }
}
pub fn windows(&self, sc_id: &AssetId, aoi_id: &AoiId) -> &[AccessWindow] {
self.windows
.get(&(sc_id.clone(), aoi_id.clone()))
.map(|v| v.as_slice())
.unwrap_or(&[])
}
pub fn all_windows(&self) -> &WindowMap {
&self.windows
}
pub fn is_empty(&self) -> bool {
self.windows.is_empty()
}
pub fn num_pairs(&self) -> usize {
self.windows.len()
}
}
#[cfg(test)]
mod tests {
use super::*;
use lox_time::Time;
use lox_time::deltas::TimeDelta;
#[test]
fn pass_direction_variants_distinct() {
assert_ne!(PassDirection::Ascending, PassDirection::Descending);
}
#[test]
fn access_window_carries_interval_and_direction() {
let start = Time::j2000(Tai);
let end = start + TimeDelta::from_seconds(60);
let interval = TimeInterval::new(start, end);
let window = AccessWindow {
interval,
direction: PassDirection::Ascending,
};
assert_eq!(window.direction, PassDirection::Ascending);
assert_eq!(window.interval.start(), start);
}
}