#![allow(non_camel_case_types, unused)]

use std::str::FromStr;

#[derive(Debug, serde::Serialize)]
pub enum DataStatus {
    OK,
    /// An Error while looking up a hash
    HASH_ERR,
    /// Timeout Error
    TIMEOUT_ERR,
}

#[derive(Debug, serde::Serialize)]
pub enum NodeStatusLogin {
    /// Accepted Login
    ACCEPTED,
    /// Rejected Login
    REJECTED,
}

#[derive(Debug, serde::Serialize)]
pub enum NodeStatusLogout {
    /// Head-Node ACKs the Logout request from compute node
    ACK,
    /// Head-Node restructured and rebalanced Task-Queue, allowing the compute node to log out
    OK,
    /// Head-Node failed to restructure and rebalance Task-Queue, preventing compute node to log out
    ERR,
}

#[derive(Debug, serde::Serialize)]
pub enum ProtocolId {
    /// Identifier indicating one node pushing data to another
    DATA_PUSH,
    /// Identifier indicating one node pulling to another
    DATA_PULL,
    /// Identifier indicating the success of a `DATA_PUSH` or `DATA_PULL`
    DATA_RESP,
    HASH_PUSH,
    HASH_PULL,
    HASH_RESP,
    /// Identifier indicating a node wants to join the cluster
    NODE_LOGIN,
    /// Identifier indicating a node being online
    NODE_ALIVE,
    /// Identifier indicating a node wants to leave the cluster
    NODE_LOGOUT,
}

pub struct Login {
    protocol_id: ProtocolId,
    node_id: String,
    transaction_uuid: uuid::Uuid,
    status: NodeStatusLogin,
}

pub struct AliveCheck {
    protocol_id: ProtocolId,
    node_id: String,
    transaction_uuid: uuid::Uuid,
}

pub struct Logout {
    protocol_id: ProtocolId,
    node_id: String,
    transaction_uuid: uuid::Uuid,
    status: NodeStatusLogout,
}

fn str_to_uuid(uuid: String) -> uuid::Uuid {
    uuid::Uuid::from_str(&uuid).unwrap()
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn uuid() {
        let res = str_to_uuid("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8".to_string());
        assert_eq!(uuid::uuid!("a1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8"), res);
    }
}