use std::collections::VecDeque;
use futures::channel::mpsc::{self, UnboundedReceiver, UnboundedSender};
pub struct History {
	pub entries: VecDeque<String>,
	pub max_size: usize,
	pub sender: UnboundedSender<String>,
	receiver: UnboundedReceiver<String>,
	current_position: Option<usize>,
}
impl Default for History {
	fn default() -> Self {
		let (sender, receiver) = mpsc::unbounded();
		Self {
			entries: Default::default(),
			max_size: 1000,
			sender,
			receiver,
			current_position: Default::default(),
		}
	}
}
impl History {
	pub async fn update(&mut self) {
		while let Ok(Some(line)) = self.receiver.try_next() {
			if self.entries.front() == Some(&line) || line.is_empty() {
				continue;
			}
			self.entries.push_front(line);
			self.current_position = None;
			if self.entries.len() > self.max_size {
				self.entries.pop_back();
			}
		}
	}
	pub fn search_next(&mut self, _current: &str) -> Option<&str> {
		if let Some(index) = &mut self.current_position {
			if *index < self.entries.len() - 1 {
				*index += 1;
			}
			Some(&self.entries[*index])
		} else if !self.entries.is_empty() {
			self.current_position = Some(0);
			Some(&self.entries[0])
		} else {
			None
		}
	}
	pub fn search_previous(&mut self, _current: &str) -> Option<&str> {
		if let Some(index) = &mut self.current_position {
			if *index == 0 {
				self.current_position = None;
				return Some("");
			}
			*index -= 1;
			Some(&self.entries[*index])
		} else {
			None
		}
	}
}