use crate::features::chrome_common::Viewport;
use rand::distr::{weighted::WeightedIndex, Distribution};
use rand::prelude::IndexedRandom;
use rand::rngs::ThreadRng;
use rand::Rng;
#[derive(Default, Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DeviceType {
#[cfg_attr(feature = "serde", serde(rename = "mobile"))]
Mobile,
#[cfg_attr(feature = "serde", serde(rename = "tablet"))]
Tablet,
#[default]
#[cfg_attr(feature = "serde", serde(rename = "desktop"))]
Desktop,
}
pub fn randomize_viewport(device: &DeviceType) -> Viewport {
let mut rng = rand::rng();
randomize_viewport_rng(device, &mut rng)
}
pub fn randomize_viewport_rng(device: &DeviceType, rng: &mut ThreadRng) -> Viewport {
match device {
DeviceType::Mobile => {
let width = rng.random_range(320..=480);
let height = rng.random_range(480..=800);
Viewport::new(width, height)
}
DeviceType::Tablet => {
let width = rng.random_range(600..=800);
let height = rng.random_range(800..=1200);
Viewport::new(width, height)
}
DeviceType::Desktop => {
let width = rng.random_range(1024..=1920);
let height = rng.random_range(768..=1080);
Viewport::new(width, height)
}
}
}
pub fn get_random_viewport() -> Viewport {
let mut rng = rand::rng();
let device_types = [DeviceType::Mobile, DeviceType::Tablet, DeviceType::Desktop];
randomize_viewport(if let Ok(dist) = WeightedIndex::new([1, 1, 3]) {
&device_types[dist.sample(&mut rng)]
} else {
device_types
.choose(&mut rng)
.unwrap_or(&DeviceType::Desktop)
})
}