use lazy_static::lazy_static;
use std::sync::Mutex;
use harsh::Harsh;
use rand::Rng;
use base64::{alphabet, engine, Engine as _};
lazy_static! {
static ref SNOWFLAKE: Mutex<rustflake::Snowflake> = Mutex::new(rustflake::Snowflake::default());
}
pub fn string_id() -> String {
format!("{}", mongodb::bson::oid::ObjectId::new())
}
pub fn random_id() -> String {
Harsh::default().encode(&[long_id().try_into().unwrap()])
}
pub fn base64_uuid() -> String {
let mut b: [u8; 16] = [0; 16];
rand::rng().fill(&mut b);
b[6] = (b[6] & 0x0F) | 0x40;
b[8] = (b[8] & 0x3F) | 0x80;
engine::GeneralPurpose::new(&alphabet::URL_SAFE, engine::general_purpose::NO_PAD).encode(b)
}
pub fn long_id() -> i64 {
let mut m = SNOWFLAKE.lock().unwrap();
m.generate()
}
#[deprecated(since = "0.0.0")]
pub fn ytid() -> String {
let v = alphaid::AlphaId::<u64>::new()
.encode(long_id() as u64)
.unwrap();
unsafe { std::str::from_utf8_unchecked(&v).to_string() }
}