// TODO: Z-index of children should be higher than parents

use bevy::prelude::*;
use monologue_trees::ui::*;

fn main() {
    App::new()
        .add_plugins((
            DefaultPlugins.set(WindowPlugin {
                primary_window: Some(Window {
                    title: "UI WTF".into(),
                    resolution: (640., 480.).into(),
                    ..default()
                }),
                ..default()
            }),
            GameUiPlugin,
        ))
        // .init_resource::<Icon>()
        .add_systems(Startup, init_ui2)
        // .add_systems(Startup, init_ui)
        // .add_systems(Update, (cursors, container))
        .run();
}

// const CURSORS: [CursorIcon; 35] = [
//     CursorIcon::Default,
//     CursorIcon::Crosshair,
//     CursorIcon::Hand,
//     CursorIcon::Arrow,
//     CursorIcon::Move,
//     CursorIcon::Text,
//     CursorIcon::Wait,
//     CursorIcon::Help,
//     CursorIcon::Progress,
//     CursorIcon::NotAllowed,
//     CursorIcon::ContextMenu,
//     CursorIcon::Cell,
//     CursorIcon::VerticalText,
//     CursorIcon::Alias,
//     CursorIcon::Copy,
//     CursorIcon::NoDrop,
//     CursorIcon::Grab,
//     CursorIcon::Grabbing,
//     CursorIcon::AllScroll,
//     CursorIcon::ZoomIn,
//     CursorIcon::ZoomOut,
//     CursorIcon::EResize,
//     CursorIcon::NResize,
//     CursorIcon::NeResize,
//     CursorIcon::NwResize,
//     CursorIcon::SResize,
//     CursorIcon::SeResize,
//     CursorIcon::SwResize,
//     CursorIcon::WResize,
//     CursorIcon::EwResize,
//     CursorIcon::NsResize,
//     CursorIcon::NeswResize,
//     CursorIcon::NwseResize,
//     CursorIcon::ColResize,
//     CursorIcon::RowResize,
// ];

fn spawn_tree(parent: &mut ChildBuilder, pos: UiKitPosition, depth: u8, length: u8) {
    let pos2 = match pos {
        UiKitPosition::Top => UiKitPosition::Left,
        _ => pos,
    };
    (0..length).for_each(|_| {
        parent
            .spawn((
                UiKitButton { color: Color::PINK },
                UiKitSelect::default(),
                UiKitLabel {
                    name: "Button".into(),
                },
            ))
            .with_children(|parent| {
                if depth > 1 {
                    parent
                        .spawn((
                            UiKitContainer { position: pos },
                            UiKitSelect::default(),
                            UiKitLabel { name: "Tab".into() },
                        ))
                        .with_children(|parent| {
                            spawn_tree(parent, pos2, depth - 1, length);
                        });
                }
            });
    });
}

fn init_ui2(mut commands: Commands) {
    commands.spawn((
        Camera2dBundle { ..default() },
        UiCameraConfig { show_ui: true },
    ));

    commands
        .spawn(NodeBundle {
            style: Style {
                width: Val::Percent(100.0),
                height: Val::Percent(100.0),
                justify_content: JustifyContent::SpaceEvenly,
                ..default()
            },
            background_color: BackgroundColor(Color::FUCHSIA),
            ..default()
        })
        .with_children(|parent| {
            parent
                .spawn(ButtonBundle {
                    style: Style {
                        border: UiRect::all(Val::Px(1.0)),
                        // width: Val::Px(200.0),
                        // height: Val::Px(150.0),
                        align_self: AlignSelf::Center,
                        ..default()
                    },
                    background_color: BackgroundColor(Color::WHITE),
                    border_color: BorderColor(Color::BLACK),
                    ..default()
                })
                .with_children(|parent| {
                    parent.spawn(UiKitTextInput::new());
                });

            parent
                .spawn(NodeBundle {
                    style: Style {
                        border: UiRect::all(Val::Px(1.0)),
                        left: Val::Px(0.0),
                        flex_direction: FlexDirection::Column,
                        position_type: PositionType::Absolute,
                        align_self: AlignSelf::Center,
                        ..default()
                    },
                    background_color: BackgroundColor(Color::PURPLE),
                    border_color: BorderColor(Color::BLACK),
                    ..default()
                })
                .with_children(|parent| {
                    spawn_tree(parent, UiKitPosition::Left, 3, 4);
                });

            parent
                .spawn(NodeBundle {
                    style: Style {
                        border: UiRect::all(Val::Px(1.0)),
                        right: Val::Px(0.0),
                        flex_direction: FlexDirection::Column,
                        position_type: PositionType::Absolute,
                        align_self: AlignSelf::Center,
                        ..default()
                    },
                    background_color: BackgroundColor(Color::PURPLE),
                    border_color: BorderColor(Color::BLACK),
                    ..default()
                })
                .with_children(|parent| {
                    spawn_tree(parent, UiKitPosition::Right, 3, 7);
                });

            parent
                .spawn(NodeBundle {
                    style: Style {
                        border: UiRect::all(Val::Px(1.0)),
                        top: Val::Px(0.0),
                        flex_direction: FlexDirection::Row,
                        position_type: PositionType::Absolute,
                        ..default()
                    },
                    background_color: BackgroundColor(Color::PURPLE),
                    border_color: BorderColor(Color::BLACK),
                    ..default()
                })
                .with_children(|parent| {
                    spawn_tree(parent, UiKitPosition::Top, 3, 3);
                });
        });
}

// #[derive(Debug, Component, Resource, Default)]
// struct Icon(CursorIcon);
//
// fn init_ui(mut commands: Commands) {
//     commands.spawn((
//         Camera2dBundle { ..default() },
//         UiCameraConfig { show_ui: true },
//     ));
//
//     commands
//         .spawn(NodeBundle {
//             style: Style {
//                 height: Val::Percent(100.0),
//                 width: Val::Percent(100.0),
//                 justify_content: JustifyContent::Start,
//                 align_items: AlignItems::Start,
//                 ..default()
//             },
//             background_color: BackgroundColor(Color::GRAY),
//             ..default()
//         })
//         .with_children(|parent| {
//             parent
//                 .spawn((
//                     GameUiNav,
//                     // Name::new("Game Nav"),
//                     NodeBundle { ..default() },
//                 ))
//                 .with_children(|parent| {
//                     parent
//                         .spawn((
//                             GameUiTab,
//                             Name::new("Grow/Shrink Tab"),
//                             NodeBundle { ..default() },
//                         ))
//                         .with_children(|parent| {
//                             parent.spawn((
//                                 UiKitContainer::new,
//                                 GameUiSet,
//                                 // Name::new("Grow/Shrink Set"),
//                                 NodeBundle { ..default() },
//                             ));
//                         });
//
//                     parent
//                         .spawn((
//                             GameUiTab,
//                             Name::new("Cursor Icons Tab"),
//                             NodeBundle { ..default() },
//                         ))
//                         .with_children(|parent| {
//                             parent
//                                 .spawn((
//                                     GameUiSet,
//                                     // Name::new("Cursor Icons Set"),
//                                     NodeBundle { ..default() },
//                                 ))
//                                 .with_children(|parent| {
//                                     CURSORS.iter().for_each(|&icon| {
//                                         parent.spawn((
//                                             GameUiButton,
//                                             Name::new(format!("{:?}", icon)),
//                                             NodeBundle { ..default() },
//                                             Icon(icon),
//                                         ));
//                                     });
//                                 });
//                         });
//                 });
//         });
// }
//
// fn cursors(
//     events: Query<(&Interaction, &Icon), (Changed<Interaction>, With<Button>)>,
//     mut primary_window: Query<&mut Window, With<PrimaryWindow>>,
//     mut curr: ResMut<Icon>,
// ) {
//     events.iter().for_each(|(&interaction, &ref icon)| {
//         let mut window = primary_window.single_mut();
//
//         match interaction {
//             Interaction::Hovered => {
//                 (*window).cursor.icon = icon.0.clone();
//             }
//             Interaction::Pressed => {
//                 curr.0 = icon.0.clone();
//             }
//             Interaction::None => {
//                 (*window).cursor.icon = curr.0.clone();
//             }
//         }
//     })
// }
//
// #[derive(Debug, Component)]
// struct Container;
//
// fn container(
//     mut events: EventReader<KeyboardInput>,
//     mut commands: Commands,
//     root: Query<Entity, With<container>>,
//     children: Query<&Children, With<container>>,
// ) {
//     events.iter().for_each(
//         |KeyboardInput {
//              key_code, state, ..
//          }| {
//             match (key_code, state) {
//                 (Some(KeyCode::Up), ButtonState::Pressed) => {
//                     commands.entity(root.single()).with_children(|parent| {
//                         parent.spawn((
//                             GameUiButton,
//                             Name::new("asdfwtf"),
//                             NodeBundle { ..default() },
//                         ));
//                     });
//                 }
//                 (Some(KeyCode::Down), ButtonState::Pressed) => {
//                     children.single().iter().last().iter().for_each(|&&child| {
//                         commands.entity(child).despawn_recursive();
//                     });
//                 }
//                 _ => (),
//             }
//         },
//     )
// }
