use ratzgo::{
    core::Element,
    event::DefaultContext,
    widget::{BorderType, block, tabs},
};

use crate::ui::{MainState, Message, NavMsg, State};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Tab {
    #[default]
    Log,
    Bookmarks,
    Tags,
    Operations,
}

pub fn view(state: Tab) -> impl Into<Element<'static, NavMsg>> {
    let inner =
        tabs!["Log [1]", "Bookmarks [2]", "Tags [3]", "Operations [4]"].select(state as usize);
    block(inner).bordered().border_type(BorderType::Rounded)
}

pub fn update(state: &mut MainState, msg: NavMsg, ctx: &mut DefaultContext<Message, State>) {
    match msg {
        NavMsg::TabSelect(tab) => state.nav_tab = tab,
        NavMsg::TabPrev => tab_prev(&mut state.nav_tab),
        NavMsg::TabNext => tab_next(&mut state.nav_tab),
    }
    ctx.queue().push(Message::Refresh);
}

const TAB_COUNT: usize = 4;

fn tab_prev(tab: &mut Tab) {
    let n = (*tab as usize + TAB_COUNT - 1) % TAB_COUNT;
    *tab = index2tab(n);
}

fn tab_next(tab: &mut Tab) {
    let n = (*tab as usize + 1) % TAB_COUNT;
    *tab = index2tab(n);
}

fn index2tab(n: usize) -> Tab {
    match n {
        0 => Tab::Log,
        1 => Tab::Bookmarks,
        2 => Tab::Tags,
        3 => Tab::Operations,
        _ => unreachable!(),
    }
}