use std::collections::VecDeque;

use ratatui::{crossterm::event::KeyCode, layout::Constraint};
use ratzgo::{core::*, widget::MountPoint};

use crate::ui::{Message, NotifyMsg, widgets::Notification};

#[derive(Debug, Default)]
pub struct State {
    pub events: VecDeque<ratzgo::log::Event>,
    pub mount_point: MountPoint<Message>,
}

pub fn view<'a>(
    State {
        events,
        mount_point,
    }: &'a State,
) -> impl Into<Element<'a, Message>> {
    if let Some(event) = events.back() {
        mount_point.mount(
            Notification::new(
                format!("{} : {}", event.level, event.target),
                event.text.clone(),
            )
            .on_key(|key| key.code == KeyCode::Esc, NotifyMsg::Confirm.into()),
            |area| area.centered(Constraint::Ratio(1, 2), Constraint::Ratio(3, 5)),
        );
    }

    mount_point.view()
}

pub fn update(state: &mut State, msg: NotifyMsg) {
    match msg {
        NotifyMsg::LogEvent(event) => {
            state.events.push_front(event);
        }
        NotifyMsg::Confirm => {
            state.events.pop_back();
        }
    }
}