//! A simple 3D scene with light shining over a cube sitting on a plane.

use bevy::{input::ButtonInput, prelude::*};
use keyseq::{bevy::pkey, Modifiers};

fn main() {
    println!("Press A key with different modifier keys.");
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, setup)
        .add_systems(Update, keyboard_input_system)
        .run();
}

#[rustfmt::skip]
/// This system detects some key presses.
fn keyboard_input_system(input: Res<ButtonInput<KeyCode>>) {
    let mods = Modifiers::from(&input);
    for key in input.get_just_pressed() {
        match (mods, key) {
            pkey!{ Ctrl-A } | pkey!{ Super-A } => println!("Just pressed Ctrl-A or Super-A!"),
            pkey!{ Ctrl-Alt-A }                => println!("Just pressed Ctrl-Alt-A!"),
            pkey!{ Ctrl-Shift-A }              => println!("Just pressed Ctrl-Shift-A!"),
            pkey!{ Alt-Shift-A }               => println!("Just pressed Alt-Shift-A!"),
            pkey!{ Shift-A }                   => println!("Just pressed Shift-A!"),
            pkey!{ Alt-A }                     => println!("Just pressed Alt-A!"),
            pkey!{ Super-A }                   => println!("Just pressed Super-A!"),
            pkey!{ A }                         => println!("Just pressed A!"),
            _                                  => println!("No key matched"),
        }
    }
}

/// set up a simple 3D scene
fn setup(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    // circular base
    commands.spawn(PbrBundle {
        mesh: meshes.add(Circle::new(4.0)),
        material: materials.add(Color::WHITE),
        transform: Transform::from_rotation(Quat::from_rotation_x(-std::f32::consts::FRAC_PI_2)),
        ..default()
    });
    // cube
    commands.spawn(PbrBundle {
        mesh: meshes.add(Mesh::from(Cuboid::default())),
        material: materials.add(Color::srgb_u8(124, 144, 255)),
        transform: Transform::from_xyz(0.0, 0.5, 0.0),
        ..default()
    });
    // light
    commands.spawn(PointLightBundle {
        point_light: PointLight {
            intensity: 1500.0,
            shadows_enabled: true,
            ..default()
        },
        transform: Transform::from_xyz(4.0, 8.0, 4.0),
        ..default()
    });
    // camera
    commands.spawn(Camera3dBundle {
        transform: Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y),
        ..default()
    });
}
