use crate::domain::{Issue, SortPolicy};
use chrono::{Duration, Utc};
pub(super) const HYBRID_SORT_RECENT_WINDOW_HOURS: i64 = 48;
pub(super) fn sort_by_policy(issues: &mut [Issue], policy: SortPolicy) {
match policy {
SortPolicy::Hybrid => {
let now = Utc::now();
let cutoff = now - Duration::hours(HYBRID_SORT_RECENT_WINDOW_HOURS);
issues.sort_by(|a, b| {
let a_is_recent = a.created_at > cutoff;
let b_is_recent = b.created_at > cutoff;
match (a_is_recent, b_is_recent) {
(true, true) => a
.priority
.cmp(&b.priority)
.then(a.created_at.cmp(&b.created_at))
.then(a.id.cmp(&b.id)),
(false, false) => a.created_at.cmp(&b.created_at).then(a.id.cmp(&b.id)),
(true, false) => std::cmp::Ordering::Less,
(false, true) => std::cmp::Ordering::Greater,
}
});
}
SortPolicy::Priority => {
issues.sort_by(|a, b| {
a.priority
.cmp(&b.priority)
.then(a.created_at.cmp(&b.created_at))
.then(a.id.cmp(&b.id))
});
}
SortPolicy::Oldest => {
issues.sort_by(|a, b| a.created_at.cmp(&b.created_at).then(a.id.cmp(&b.id)));
}
}
}