use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum LDBNatsMessage {
    Command(LypheDBCommand),
    Entries(KVList),
    Count(u64),
    Success,
    BadRequest,
    NotFound,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum PropagationStrategy {
    /// Reads will immediately be able to read this key's value as soon as it has been set
    Immediate,
    /// The value change will be queued along with others,
    /// then in a period of either inactivity or a maximum time, all changes will be immediately
    /// seen at once
    Timeout,
    /// The key will be removed from the cache, and thus the next read will cause a cache miss,
    /// and the value will be loaded from disk
    OnRead,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum LypheDBCommand {
    SetKeys(KVList, PropagationStrategy),
    GetKeys(KeyList),
    CountKeys(KeyDirectory),
    /// NOT RECURSIVE
    GetKeyDirectory(KeyDirectory),
    DeleteKeys(KeyList),
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct KVList {
    pub kvs: Vec<(Vec<u8>, Vec<u8>)>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct KeyList {
    pub keys: Vec<Vec<u8>>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct KeyDirectory {
    pub key: Vec<u8>,
}