use std::cell::RefCell;

use cgmath::Vector3;

use crate::{GameState, eguictx::EguiCtx, solar_system, timeman::{Second, TimeMan}};

#[derive(Default, Clone)]
pub struct GameWindowUiState
{
    pub current_system: Option<solar_system::SystemId>,
    pub camera_scale: f32,
    pub camera_target: Option<solar_system::BodyId>,
    pub auto_time: Option<Second>,
    pub do_auto_tick: bool
}

impl GameWindowUiState
{
    pub fn render(
        old_state: &GameWindowUiState,
        game_state: &RefCell<GameState>,
        eguictx: &EguiCtx)
    -> Self
    {
        let mut new_state = old_state.clone();

        { GameWindowUiState::render_topbar(&mut new_state, game_state, eguictx); }

        new_state
    }

    fn render_topbar(
        state: &mut GameWindowUiState,
        game_state: &RefCell<GameState>,
        eguictx: &EguiCtx)
    {
        let mut game_state = game_state.borrow_mut();

        egui::TopBottomPanel::top("topbar").show(
            eguictx.context(),
            |ui| {
                
            ui.horizontal(|ui| {
                ui.menu_button("File", |ui| {

                });
            });

            ui.horizontal(|ui| {
                let solar_systems = game_state.solar_systems();
                let selected_label = match state.current_system {
                    Some(id) => solar_systems[id].name(),
                    None => ""
                };

                egui::ComboBox::from_label("Current System")
                    .selected_text(selected_label)
                    .show_ui(ui, |ui| {
                
                    for (i, system) in solar_systems.iter().enumerate() {
                        ui.selectable_value(
                            &mut state.current_system,
                            Some(i),
                            system.name()
                        );
                    }
                });
            });

            ui.horizontal(|ui| {
                ui.label(format!("Time: {}", TimeMan::format_duration(game_state.timeman().seconds())));
                
                let button_seconds = [1, 5, 30, 60, 60*5, 60*30, 60*60, 60*60*24, 60*60*24*5, 60*60*24*30];
                let selected_button = state.auto_time;

                button_seconds.iter().for_each(|&seconds| {
                    ui.vertical(|ui| {
                        let auto_selected = match selected_button {
                            Some(o) => o == seconds,
                            None => false
                        };
                        let label = TimeMan::format_duration(seconds);

                        if ui.button(label.clone()).clicked() {
                            game_state.timeman_mut().advance(seconds);
                        }

                        if ui.add(egui::Button::new(label.clone()).selected(auto_selected)).clicked() {
                            state.auto_time = Some(seconds);
                        }
                    });
                });
            });
        });
    }
}
