use crypto::digest::Digest;
use crypto::sha2::Sha512;
pub const GRID_PIKE_NAMESPACE: &str = "621dee05";
pub const AGENT_PREFIX: &str = "00";
pub const GRID_PIKE_AGENT_NAMESPACE: &str = "621dee0500";
pub const ORG_PREFIX: &str = "01";
pub const GRID_PIKE_ORGANIZATION_NAMESPACE: &str = "621dee0501";
pub const ROLE_PREFIX: &str = "02";
pub const GRID_PIKE_ROLE_NAMESPACE: &str = "621dee0502";
pub const ALTERNATE_ID_INDEX_ENTRY_PREFIX: &str = "03";
pub const GRID_PIKE_ALTERNATE_ID_INDEX_ENTRY_NAMESPACE: &str = "621dee0503";
pub fn compute_agent_address(public_key: &str) -> String {
let mut sha = Sha512::new();
sha.input(public_key.as_bytes());
let hash_str =
String::from(GRID_PIKE_NAMESPACE) + &String::from(AGENT_PREFIX) + &sha.result_str();
hash_str[..70].to_string()
}
pub fn compute_organization_address(org_id: &str) -> String {
let mut sha = Sha512::new();
sha.input(org_id.as_bytes());
let hash_str = String::from(GRID_PIKE_NAMESPACE) + ORG_PREFIX + &sha.result_str();
hash_str[..70].to_string()
}
pub fn compute_role_address(name: &str, org_id: &str) -> String {
let uname = format!("{}.{}", org_id, name);
let mut sha = Sha512::new();
sha.input(uname.as_bytes());
let hash_str = String::from(GRID_PIKE_NAMESPACE) + ROLE_PREFIX + &sha.result_str();
hash_str[..70].to_string()
}
pub fn compute_alternate_id_index_entry_address(id_type: &str, id: &str) -> String {
let uname = format!("{}:{}", id_type, id);
let mut sha = Sha512::new();
sha.input(uname.as_bytes());
let hash_str =
String::from(GRID_PIKE_NAMESPACE) + ALTERNATE_ID_INDEX_ENTRY_PREFIX + &sha.result_str();
hash_str[..70].to_string()
}