use crate::tui::app::App;
use ratatui::Frame;
use ratatui::layout::{Constraint, Direction, Layout, Rect};
use ratatui::prelude::Style;
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Paragraph};
pub(super) fn render_footer(f: &mut Frame, area: Rect, app: &App) {
let mut current_view_key_bindings = Vec::with_capacity(10);
let mut global_key_bindings = Vec::with_capacity(10);
if app.is_edit_mode() {
current_view_key_bindings.push(Span::from("[Esc] Quit edit mode, "));
} else {
global_key_bindings.push(Span::from("Global key bindings: "));
if app.is_scheduler_up() {
global_key_bindings.push(Span::from("[j] Jobs, "));
global_key_bindings.push(Span::from("[e] Executors, "));
global_key_bindings.push(Span::from("[m] Metrics, "));
if app.is_jobs_view() {
if app.job_dot_popup.is_some() {
current_view_key_bindings.push(Span::from("[↑↓] Scroll up/down, "));
current_view_key_bindings.push(Span::from("[Esc] Close popup, "));
} else if app.job_plan_popup.is_some() {
current_view_key_bindings.push(Span::from("[↑↓] Scroll up/down, "));
current_view_key_bindings.push(Span::from("[s] Stage plan, "));
current_view_key_bindings.push(Span::from("[p] Physical plan, "));
current_view_key_bindings.push(Span::from("[l] Logical plan, "));
current_view_key_bindings.push(Span::from("[Esc] Close popup, "));
} else {
if app.has_more_than_one_job() {
current_view_key_bindings.push(Span::from("[↑↓] Navigate, "));
current_view_key_bindings.push(Span::from("[/] Search jobs, "));
current_view_key_bindings.push(Span::from(
"[1,2,3] Sort by first/second/third/... column, ",
));
}
if app.has_selected_job() {
if !app.is_job_stages_popup_open() {
current_view_key_bindings
.push(Span::from("[Enter] View stages, "));
current_view_key_bindings
.push(Span::from("[g] View job stages graph, "));
if app.is_selected_job_cancelable() {
current_view_key_bindings
.push(Span::from("[c] Cancel job, "));
}
if app.is_selected_job_completed_or_running() {
current_view_key_bindings
.push(Span::from("[p] View job plans, "));
}
} else if app.is_job_stage_no_details_popup_open() {
current_view_key_bindings.push(Span::from("[↑↓] Navigate, "));
current_view_key_bindings
.push(Span::from("[Enter] View tasks, "));
current_view_key_bindings.push(Span::from("[p] View plan, "));
current_view_key_bindings
.push(Span::from("[Esc] Close popup, "));
} else if app.is_job_stage_plan_popup_open() {
current_view_key_bindings
.push(Span::from("[↑↓] Scroll up/down, "));
current_view_key_bindings
.push(Span::from("[Esc] Close popup, "));
} else if app.is_job_stage_tasks_popup_open() {
current_view_key_bindings
.push(Span::from("[Esc] Close popup, "));
}
}
}
if !current_view_key_bindings.is_empty() {
current_view_key_bindings
.insert(0, Span::from("Current view key bindings: "));
}
} else if app.is_executors_view() {
if app.is_executor_details_popup_open() {
current_view_key_bindings.push(Span::from("[↑↓] Scroll up/down, "));
current_view_key_bindings.push(Span::from("[Esc] Close popup, "));
} else {
if app.has_selected_executor() {
current_view_key_bindings
.push(Span::from("[Enter] View details, "));
}
current_view_key_bindings.push(Span::from("[↑↓] Navigate, "));
current_view_key_bindings
.push(Span::from("[1,2,...] Sort by first/second/... column, "));
}
if !current_view_key_bindings.is_empty() {
current_view_key_bindings
.insert(0, Span::from("Current view key bindings: "));
}
} else if app.is_metrics_view() {
current_view_key_bindings.push(Span::from("Metrics key bindings: "));
current_view_key_bindings.push(Span::from("[/] Search metrics, "));
}
global_key_bindings.push(Span::from("[i] Scheduler info, "));
}
global_key_bindings.push(Span::from("[?/h] Help, "));
global_key_bindings.push(Span::from("[q/Esc] Quit"));
}
let global_area = if !current_view_key_bindings.is_empty() {
let areas = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Min(1), Constraint::Min(1), ])
.split(area);
let line = Line::from(current_view_key_bindings);
let block = Block::default();
let paragraph = Paragraph::new(line)
.style(Style::default().bold())
.block(block)
.centered();
f.render_widget(paragraph, areas[0]);
areas[1]
} else {
area
};
let line = Line::from(global_key_bindings);
let block = Block::default();
let paragraph = Paragraph::new(line)
.style(Style::default().bold())
.block(block)
.centered();
f.render_widget(paragraph, global_area);
}