use hmac::{Hmac, Mac, NewMac};
use rand::{thread_rng, Rng};
use sha2::Sha256;
use base64::{encode, decode};
use crate::error::{WebullError, WebullResult};
pub fn generate_device_id() -> String {
let mut rng = thread_rng();
let random_bytes: [u8; 16] = rng.gen();
encode(&random_bytes)
}
pub fn generate_signature(key: &str, message: &str) -> WebullResult<String> {
type HmacSha256 = Hmac<Sha256>;
let mut mac = HmacSha256::new_from_slice(key.as_bytes())
.map_err(|e| WebullError::InvalidRequest(format!("Invalid key: {}", e)))?;
mac.update(message.as_bytes());
let result = mac.finalize();
let signature = encode(result.into_bytes());
Ok(signature)
}
pub fn encrypt_password(password: &str, _key: &str) -> WebullResult<String> {
let encrypted = encode(password.as_bytes());
Ok(encrypted)
}
pub fn decrypt_data(data: &str, _key: &str) -> WebullResult<String> {
let decoded = decode(data)
.map_err(|e| WebullError::InvalidRequest(format!("Invalid data: {}", e)))?;
let decrypted = String::from_utf8(decoded)
.map_err(|e| WebullError::InvalidRequest(format!("Invalid UTF-8: {}", e)))?;
Ok(decrypted)
}
pub fn generate_timestamp() -> String {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_millis();
now.to_string()
}