use wasm_bindgen::JsCast;
use crate::experiments::config::{Experiment, cookie_name, pick_variant, resolve_variant};
const COOKIE_MAX_AGE_SECS: u32 = 60 * 60 * 24 * 30;
pub fn read_cookie(name: &str) -> Option<String> {
let cookie = html_document()?.cookie().ok()?;
cookie.split(';').find_map(|pair| {
let (key, value) = pair.trim().split_once('=')?;
(key == name).then(|| value.to_string())
})
}
pub fn write_variant(key: &str, value: &str) {
if let Some(doc) = html_document() {
let cookie = format!("{}={value}; path=/; max-age={COOKIE_MAX_AGE_SECS}; samesite=lax", cookie_name(key));
let _ = doc.set_cookie(&cookie);
}
}
pub fn current_variant(exp: &Experiment, key: &str) -> String {
resolve_variant(exp, read_cookie(&cookie_name(key)).as_deref())
}
pub fn assign_variant(exp: &Experiment, key: &str) -> String {
if let Some(existing) = read_cookie(&cookie_name(key))
&& exp.variants.iter().any(|v| *v == existing)
{
return existing;
}
let variant = pick_variant(exp, js_sys::Math::random);
write_variant(key, &variant);
variant
}
fn html_document() -> Option<web_sys::HtmlDocument> {
web_sys::window()?.document()?.dyn_into::<web_sys::HtmlDocument>().ok()
}