#[cfg(feature = "joystick")]
pub(crate) mod joystick{
    use std::thread;
    use std::time::Duration;
    use enigo::{Enigo, Key, KeyboardControllable};
    use rand::Rng;

    pub enum MoveMode{
        // 横向
        HORIZONTAL,
        // 纵向
        PORTRAIT,
        // 随机
        RANDOM,
    }

    impl MoveMode {
        pub fn to_key_list(&self) -> Vec<Key>{
            return match self {
                MoveMode::HORIZONTAL => vec![Key::Layout('j'),Key::Layout('l')],
                MoveMode::PORTRAIT => vec![Key::UpArrow,Key::DownArrow],
                MoveMode:: RANDOM => vec![Key::LeftArrow,Key::RightArrow,Key::UpArrow,Key::DownArrow],
            }
        }
    }


    pub(crate) fn move_once_by_mode(road : &MoveMode, index : usize){
        let mut enigo = Enigo::new();
        let moves = road.to_key_list();
        let move_index = index % moves.len();
        let move_key = moves[move_index];
        long_press(enigo,move_key,1000,500);
    }

    pub(crate) fn once_press(mut enigo:Enigo, key: Key){
        enigo.key_click(key);
    }

    pub(crate) fn quick_press(key: Key){
        let mut enigo = Enigo::new();
        let mut rng = rand::thread_rng();
        enigo.key_down(key);
        thread::sleep(Duration::from_millis(rng.gen_range(0 .. 20)));
        enigo.key_up(key);
    }

    pub(crate) fn long_press(mut enigo:Enigo, key: Key, est_time: isize, random_time: isize){
        let mut rng = rand::thread_rng();
        enigo.key_down(key);
        let act = est_time + rng.gen_range((-random_time .. random_time));
        thread::sleep(Duration::from_millis(act as u64));
        enigo.key_up(key);
    }



}