Documentation
use crate::Event;
use crate::event::EventOnce;
use std::collections::HashMap;
use std::sync::{Arc, Mutex, RwLock};

#[derive(Debug, Clone, Default)]
pub struct EventSchedule {
    events: Arc<RwLock<HashMap<Vec<u8>, Vec<Arc<dyn Event + Send + 'static>>>>>,
    once_events: Arc<Mutex<HashMap<Vec<u8>, Vec<Box<dyn EventOnce + Send + 'static>>>>>,
}

impl EventSchedule {
    pub async fn raw_register_event<E: Event + Send + 'static>(&self, key: Vec<u8>, event: E) {
        let e = Arc::new(event);
        let mut write = self.events.write().unwrap_or_else(|err| err.into_inner());
        if let Some(events) = write.get_mut(key.as_slice()) {
            events.push(e);
        } else {
            write.insert(key, vec![e]);
        }
    }
    pub fn raw_register_once_event<E: EventOnce + Send + 'static>(&self, key: Vec<u8>, event: E) {
        let e = Box::new(event);
        let mut once_events = self
            .once_events
            .lock()
            .unwrap_or_else(|err| err.into_inner());
        if let Some(events) = once_events.get_mut(key.as_slice()) {
            events.push(e);
        } else {
            once_events.insert(key, vec![e]);
        }
    }

    pub async fn raw_load_events(&self, key: &[u8]) -> Vec<Arc<dyn Event + Send + 'static>> {
        let events = self.events.read().unwrap_or_else(|err| err.into_inner());
        events.get(key).cloned().unwrap_or_default()
    }
    pub fn raw_load_once_events(&self, key: &[u8]) -> Vec<Box<dyn EventOnce + Send + 'static>> {
        let mut once_events = self
            .once_events
            .lock()
            .unwrap_or_else(|err| err.into_inner());
        once_events.remove(key).unwrap_or_default()
    }
}