use crate::compsys::ported::_wanted::_wanted;
use crate::ported::modules::zutil::{lookupstyle, testforstyle};
use crate::ported::params::{getaparam, getsparam, setaparam, setsparam};
use crate::ported::zle::compcore::get_compstate_str;
pub fn _history() -> i32 {
let historywords = getaparam("historywords").unwrap_or_default();
let hmax = historywords.len();
let mut beg = 2usize;
let curcontext = getsparam("curcontext").unwrap_or_default();
let ctx = format!(":completion:{}:", curcontext);
let remove_all_dups = testforstyle(&ctx, "remove-all-dups") == 0;
let opt_prefix = if remove_all_dups { "-" } else { "-1" };
let sort_on = testforstyle(&ctx, "sort") == 0;
let opt = if sort_on {
format!("{}J", opt_prefix)
} else {
format!("{}V", opt_prefix)
};
let range_val = lookupstyle(&ctx, "range")
.first()
.cloned()
.unwrap_or_default();
let (mut max, slice): (usize, usize) = if !range_val.is_empty() {
let (m_str, s_str) = if range_val.contains(':') {
let mut parts = range_val.splitn(2, ':');
let m = parts.next().unwrap_or("0").to_string();
let s = parts.next().unwrap_or("0").to_string();
(m, s)
} else {
(range_val.clone(), range_val)
};
let m = m_str.parse::<usize>().unwrap_or(hmax);
let s = s_str.parse::<usize>().unwrap_or(m);
(m.min(hmax), s)
} else {
(hmax, hmax)
};
if max > hmax {
max = hmax;
}
let prefix = getsparam("PREFIX").unwrap_or_default();
let iprefix = getsparam("IPREFIX").unwrap_or_default();
let _ = setsparam("PREFIX", &format!("{}{}", iprefix, prefix));
let _ = setsparam("IPREFIX", "");
let suffix = getsparam("SUFFIX").unwrap_or_default();
let isuffix = getsparam("ISUFFIX").unwrap_or_default();
let _ = setsparam("SUFFIX", &format!("{}{}", suffix, isuffix));
let _ = setsparam("ISUFFIX", "");
while get_compstate_str("nmatches").and_then(|s| s.parse::<i64>().ok()) == Some(0)
&& beg < max
{
let end = (beg + slice).min(hmax);
let hslice: Vec<String> = if beg <= end && beg >= 1 && end <= historywords.len() {
historywords[beg - 1..end].to_vec()
} else {
Vec::new()
};
setaparam("hslice", hslice);
let _ = _wanted(&[
opt.clone(),
"history-words".to_string(),
"expl".to_string(),
"history word".to_string(),
"compadd".to_string(),
"-Q".to_string(),
"-a".to_string(),
"hslice".to_string(),
]);
beg += slice;
if slice == 0 {
break;
}
}
let nm: i64 = get_compstate_str("nmatches")
.and_then(|s| s.parse().ok())
.unwrap_or(0);
if nm == 0 {
1
} else {
0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_historywords_returns_one() {
let _g = crate::test_util::global_state_lock();
setaparam("historywords", Vec::new());
assert_eq!(_history(), 1);
}
}