use ratatui::{
style::{Modifier, Style},
text::{Line, Span},
};
use crate::github::detail::ReviewThread;
use crate::theme::Palette;
use super::comments::{render_thread_body, thread_gutter};
const CARD_PAD: &str = " ";
pub(super) fn render_thread_card(
threads: &[&ReviewThread],
expanded: bool,
palette: &Palette,
ascii: bool,
) -> Vec<Line<'static>> {
let total = threads.len();
let unresolved = threads.iter().filter(|t| !t.is_resolved && !t.is_outdated).count();
if !expanded {
return vec![collapsed_summary_line(total, unresolved, palette, ascii)];
}
let gutter = thread_gutter(ascii);
let reply_glyph = if ascii { "> " } else { "\u{21b3} " };
let mut out: Vec<Line<'static>> = Vec::new();
for (idx, thread) in threads.iter().enumerate() {
if idx > 0 {
out.push(Line::from(vec![Span::raw(CARD_PAD)]));
}
let mut body = render_thread_body(thread, true, gutter, reply_glyph, palette, ascii);
if let Some(header_line) = body.first_mut() {
header_line.spans.push(Span::styled(
" [t] collapse [T] collapse all".to_owned(),
Style::default().fg(palette.dim),
));
}
for line in &mut body {
line.spans.insert(0, Span::raw(CARD_PAD));
}
out.extend(body);
}
out
}
fn collapsed_summary_line(
total: usize,
unresolved: usize,
palette: &Palette,
ascii: bool,
) -> Line<'static> {
let (glyph, glyph_color) = if unresolved > 0 {
(if ascii { "?" } else { "\u{25CB}" }, palette.warning) } else {
(if ascii { "+" } else { "\u{2714}" }, palette.muted) };
let thread_word = if total == 1 { "thread" } else { "threads" };
let count_text = format!(" {total} {thread_word}");
let unresolved_text = if unresolved > 0 {
format!(" \u{00B7} {unresolved} unresolved") } else {
String::new()
};
Line::from(vec![
Span::raw(CARD_PAD),
Span::styled(glyph, Style::default().fg(glyph_color)),
Span::styled(count_text, Style::default().fg(palette.foreground)),
Span::styled(unresolved_text, Style::default().fg(palette.warning)),
Span::styled(
" [t] expand".to_owned(),
Style::default().fg(palette.dim).add_modifier(Modifier::DIM),
),
])
}