use avian3d::prelude::*;

use bevy::log::tracing_subscriber::util::SubscriberInitExt;
use bevy::prelude::{GamepadButtonType, KeyCode};
use bevy::reflect::Reflect;
use leafwing_input_manager::prelude::*;

#[derive(Actionlike, PartialEq, Eq, Hash, Clone, Copy, Debug, Reflect)]
#[actionlike(Button)]
pub enum Action {
    StrafePosX,
    StrafePosY,
    StrafePosZ,
    StrafeNegX,
    StrafeNegY,
    StrafeNegZ,
    #[actionlike(DualAxis)]
    StrafeXZ,
    PosYaw,
    NegYaw,
    PosPitch,
    NegPitch,
    PosRoll,
    NegRoll,
    #[actionlike(DualAxis)]
    PitchYaw,
    Brake,
    Quit,
}

pub fn default_input_map() -> InputMap<Action> {
    let mut input_map = InputMap::default();
    input_map.insert_dual_axis(Action::StrafeXZ, KeyboardVirtualDPad::WASD);
    input_map.insert(Action::Brake, KeyCode::KeyX);
    input_map.insert(Action::Brake, GamepadButtonType::South);
    input_map.insert_dual_axis(Action::StrafeXZ, GamepadStick::LEFT);
    input_map.insert_dual_axis(Action::PitchYaw, GamepadStick::RIGHT);
    input_map.insert(Action::PosRoll, GamepadButtonType::RightTrigger);
    input_map.insert(Action::NegRoll, GamepadButtonType::LeftTrigger);
    input_map.insert(Action::PosRoll, KeyCode::KeyE);
    input_map.insert(Action::NegRoll, KeyCode::KeyQ);
    input_map.insert(Action::StrafePosY, KeyCode::Space);
    input_map.insert(Action::Quit, KeyCode::Escape);
    input_map.insert(Action::StrafeNegY, KeyCode::ControlLeft);
    input_map
}
pub fn input_bundle() -> InputManagerBundle<Action> {
    let input_map = default_input_map();
    InputManagerBundle {
        action_state: ActionState::default(),
        // Describes how to convert from player inputs into those actions
        input_map,
    }
}