use std::borrow::Cow;
use crate::fx::FxHashMap as HashMap;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::OnceLock;
static RENAMES: OnceLock<HashMap<String, String>> = OnceLock::new();
static REVERSE: OnceLock<HashMap<String, String>> = OnceLock::new();
static ACTIVE: AtomicBool = AtomicBool::new(false);
pub fn set_class_renames(map: HashMap<String, String>) {
if !map.is_empty() {
ACTIVE.store(true, Ordering::Relaxed);
}
let rev: HashMap<String, String> = map
.iter()
.filter(|(k, v)| k != v)
.map(|(k, v)| (v.clone(), k.clone()))
.collect();
let _ = REVERSE.set(rev);
let _ = RENAMES.set(map);
}
#[inline]
pub fn is_renamed_display(internal: &str) -> bool {
REVERSE.get().is_some_and(|m| m.contains_key(internal))
}
#[inline]
pub fn apply_class_rename(internal: &str) -> Cow<'_, str> {
if !ACTIVE.load(Ordering::Relaxed) {
return Cow::Borrowed(internal);
}
let Some(map) = RENAMES.get() else {
return Cow::Borrowed(internal);
};
if let Some(d) = map.get(internal) {
return if d == internal {
Cow::Borrowed(internal)
} else {
Cow::Owned(d.clone())
};
}
let mut s = internal;
while let Some(i) = s.rfind('$') {
s = &s[..i];
match map.get(s) {
Some(d) if d != s => {
let suffix = &internal[s.len()..];
return Cow::Owned(format!("{d}{suffix}"));
}
Some(_) => return Cow::Borrowed(internal),
None => continue,
}
}
Cow::Borrowed(internal)
}