use bevy::{
    core_pipeline::{
        tonemapping::Tonemapping,
    },
    window::*,
    prelude::*,
};

use bevy_egui::{egui, EguiContexts, EguiPlugin};

use std::collections::HashMap;
use lazy_static::lazy_static;

mod helpers;
use crate::helpers::*;

const VERSION: &str = env!("CARGO_PKG_VERSION");
const PKGNAME: &str = env!("CARGO_PKG_NAME");

// Create a map of the Hypernova colorscheme
lazy_static!{
    static ref HYPERNOVA: HashMap<&'static str, (u8, u8, u8)> = vec![
        ("BLACK", (13, 13, 15)),
        ("DARK_GRAY", (21, 21, 23)),
        ("GRAY", (39, 39, 43)),
        ("LIGHT_GRAY", (69, 68, 73)),
        ("SUBTEXT", (217, 208, 215)),
        ("WHITE", (236, 229, 234)),
        ("RED", (240, 105, 105)),
        ("MAGENTA", (232, 135, 187)),
        ("PURPLE", (162, 146, 232)),
        ("BLUE", (120, 175, 196)),
        ("CYAN", (126, 230, 174)),
        ("GREEN", (145, 214, 92)),
        ("YELLOW", (217, 213, 100)),
    ].iter().copied().collect();
}

fn main() {
    App::new()
        .add_plugins(
            (
                DefaultPlugins.set(WindowPlugin {
                    primary_window: Some(Window {
                        title: format!("{} {}", titlecase(PKGNAME), VERSION).into(),
                        mode: WindowMode::Fullscreen,
                        ..default()
                    }),
                    ..default()
                }), 
                EguiPlugin
            )
        )
        .add_systems(Startup, 
                     (setup, setup_ui))
        .add_systems(Update, render_ui)
        .run();
}

// Bevy engine setup
fn setup(mut commands: Commands) {
    commands.spawn(
        Camera2dBundle {
            camera: Camera {
                hdr: true,
                ..default()
            },
            tonemapping: Tonemapping::TonyMcMapface,
            ..default()
        }
    );
}

// On startup: setup some UI components
fn setup_ui(
    mut contexts: EguiContexts,
) {
    // Set Victor Mono as the default custom font
    let mut fonts = egui::FontDefinitions::default();
    fonts.font_data.insert("victor_mono".to_owned(),
        egui::FontData::from_static(include_bytes!("../assets/fonts/VictorMono-Regular.otf")));
    fonts.families.get_mut(&egui::FontFamily::Proportional).unwrap()
        .insert(0, "victor_mono".to_owned());
    contexts.ctx_mut().set_fonts(fonts);


    let mut username_text: String = "Username".to_string();
}

// On update: render the UI
fn render_ui(
    mut contexts: EguiContexts,
    mut windows: Query<&mut Window>,
) {
    let window = windows.single_mut();
    let window_width = window.resolution.width();
    let window_height = window.resolution.height();

    egui::Window::new("Login")
        .anchor(egui::Align2::CENTER_CENTER, egui::Vec2::new(0., 0.))
        .resizable(false)
        .title_bar(false)
        .show(contexts.ctx_mut(), |ui| {
            ui.set_width(window_width / 2.5);
            ui.set_height(window_height / 3.);

            ui.with_layout(egui::Layout::top_down(egui::Align::Center), |ui| {
                let purple = HYPERNOVA.get("PURPLE").unwrap();
                let purple = egui::Color32::from_rgb(purple.0, purple.1, purple.2);

                ui.heading(egui::RichText::new("Login").size(30.).color(purple));

                let username = egui::TextEdit::singleline(&mut username_text);
                let output = username.show(ui);
            });
        });
}