use ratatui::Frame;
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::{Color, Style};
use ratatui::text::Span;
use ratatui::widgets::{Block, List, ListItem, Scrollbar, ScrollbarOrientation};
use super::super::app::App;
use super::super::widgets::checked_popup::draw_checked_popup;
use super::super::widgets::detail_panel::draw_detail_panel;
use super::super::widgets::helpers::{filter_items, get_item_at_visual_index, get_selected_item};
use super::super::widgets::search_input::draw_search_input;
pub fn draw_tab_components(frame: &mut Frame, app: &mut App, area: Rect) {
let horizontal_chunks = Layout::horizontal([Constraint::Percentage(35), Constraint::Percentage(65)]).split(area);
let left_chunks = Layout::vertical([Constraint::Length(3), Constraint::Min(0)]).split(horizontal_chunks[0]);
let components_refs: Vec<&str> = app.components.iter().map(|s| s.as_str()).collect();
let filtered_components = filter_items(&components_refs, &app.components_search_query);
if !filtered_components.is_empty() && app.components_scroll >= filtered_components.len() {
app.components_scroll = filtered_components.len().saturating_sub(1);
}
app.components_scroll_state = app.components_scroll_state.content_length(filtered_components.len());
let items: Vec<ListItem> = filtered_components
.iter()
.map(|component| {
let is_checked = app.components_checked.contains(*component);
let (checkbox, color) = if is_checked { ("☑", Color::Green) } else { ("☐", Color::DarkGray) };
ListItem::new(Span::styled(format!(" {} {}", checkbox, component), Style::default().fg(color)))
})
.collect();
let checked_count = app.components_checked.len();
let title = if app.components_search_query.is_empty() {
if checked_count > 0 {
format!("Components ({}) - {} Selected", app.components.len(), checked_count)
} else {
format!("Components ({})", app.components.len())
}
} else if checked_count > 0 {
format!("Components ({}/{}) - {} Selected", filtered_components.len(), app.components.len(), checked_count)
} else {
format!("Components ({}/{})", filtered_components.len(), app.components.len())
};
let list =
List::new(items).block(Block::bordered().title(title)).highlight_style(Style::default().bg(Color::DarkGray));
if !filtered_components.is_empty() {
app.components_list_state.select(Some(app.components_scroll));
}
draw_search_input(frame, &app.components_search_query, app.components_search_active, left_chunks[0]);
frame.render_stateful_widget(list, left_chunks[1], &mut app.components_list_state);
frame.render_stateful_widget(
Scrollbar::new(ScrollbarOrientation::VerticalRight).begin_symbol(Some("↑")).end_symbol(Some("↓")),
left_chunks[1],
&mut app.components_scroll_state,
);
let selected_component = if !filtered_components.is_empty() && app.components_scroll < filtered_components.len() {
Some(filtered_components[app.components_scroll])
} else {
None
};
draw_detail_panel(frame, selected_component, app.components_checked.len(), "component", horizontal_chunks[1]);
if app.show_popup && !app.components_checked.is_empty() {
let mut checked_list: Vec<String> = app.components_checked.iter().cloned().collect();
checked_list.sort();
draw_checked_popup(frame, &checked_list, "Checked Components", "component", Color::Green, area, 70, 60);
}
}
pub fn get_selected_component(app: &App) -> Option<String> {
let components_refs: Vec<&str> = app.components.iter().map(|s| s.as_str()).collect();
get_selected_item(&components_refs, app.components_scroll, &app.components_search_query).map(|s| s.to_string())
}
pub fn get_component_at_visual_index(app: &App, visual_index: usize) -> Option<String> {
let components_refs: Vec<&str> = app.components.iter().map(|s| s.as_str()).collect();
get_item_at_visual_index(&components_refs, visual_index, &app.components_search_query).map(|s| s.to_string())
}