use ratatui::{
layout::Rect,
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::Paragraph,
Frame,
};
use crate::services::{AccountService, BudgetService};
use crate::tui::app::App;
pub fn render(frame: &mut Frame, app: &mut App, area: Rect) {
let budget_service = BudgetService::new(app.storage);
let atb = budget_service
.get_available_to_budget(&app.current_period)
.unwrap_or_default();
let balance_info = if let Some(account_id) = app.selected_account {
let account_service = AccountService::new(app.storage);
account_service.calculate_balance(account_id).ok()
} else {
None
};
let mut spans = vec![];
let atb_color = if atb.is_negative() {
Color::Red
} else if atb.is_zero() {
Color::Green
} else {
Color::Yellow
};
spans.push(Span::styled(" ATB: ", Style::default().fg(Color::White)));
spans.push(Span::styled(
format!("{}", atb),
Style::default().fg(atb_color).add_modifier(Modifier::BOLD),
));
spans.push(Span::raw(" │ "));
spans.push(Span::styled(
format!("{}", app.current_period),
Style::default().fg(Color::Cyan),
));
if let Some(balance) = balance_info {
spans.push(Span::raw(" │ "));
spans.push(Span::styled("Bal: ", Style::default().fg(Color::White)));
let balance_color = if balance.is_negative() {
Color::Red
} else {
Color::Green
};
spans.push(Span::styled(
format!("{}", balance),
Style::default().fg(balance_color),
));
}
if let Some(ref message) = app.status_message {
spans.push(Span::raw(" │ "));
spans.push(Span::styled(
message.as_str(),
Style::default().fg(Color::Yellow),
));
}
let hints = " q:Quit ?:Help / or ::Command ";
let left_len: usize = spans.iter().map(|s| s.content.len()).sum();
let padding_len = (area.width as usize)
.saturating_sub(left_len)
.saturating_sub(hints.len())
.max(1);
let padding = " ".repeat(padding_len);
spans.push(Span::raw(padding));
spans.push(Span::styled(hints, Style::default().fg(Color::White)));
let line = Line::from(spans);
let paragraph = Paragraph::new(line);
frame.render_widget(paragraph, area);
}