govctl 0.9.4

Project governance CLI for RFC, ADR, and Work Item management
use super::super::rounded_block;
use ratatui::{prelude::*, widgets::Paragraph};

pub(in crate::tui::ui) struct SummaryCard {
    title: &'static str,
    border_color: Color,
    metrics: Vec<SummaryMetric>,
    total: usize,
}

impl SummaryCard {
    pub(in crate::tui::ui) fn new(
        title: &'static str,
        border_color: Color,
        metrics: Vec<SummaryMetric>,
        total: usize,
    ) -> Self {
        Self {
            title,
            border_color,
            metrics,
            total,
        }
    }

    pub(in crate::tui::ui) fn into_paragraph(self) -> Paragraph<'static> {
        let title = self.title;
        let border_color = self.border_color;
        Paragraph::new(self.lines())
            .block(rounded_block(title).border_style(Style::default().fg(border_color)))
    }

    fn lines(self) -> Vec<Line<'static>> {
        let mut lines = Vec::with_capacity(self.metrics.len() + 3);
        lines.push(Line::from(""));
        lines.extend(self.metrics.into_iter().map(SummaryMetric::render));
        lines.push(Line::from(""));
        lines.push(Line::from(vec![
            Span::raw("  "),
            Span::styled("Σ", Style::default().fg(Color::Cyan).bold()),
            Span::styled(format!(" Total: {}", self.total), Style::default().bold()),
        ]));
        lines
    }
}

pub(in crate::tui::ui) struct SummaryMetric {
    icon: &'static str,
    icon_color: Color,
    label: &'static str,
    value: usize,
}

impl SummaryMetric {
    pub(in crate::tui::ui) fn new(
        icon: &'static str,
        icon_color: Color,
        label: &'static str,
        value: usize,
    ) -> Self {
        Self {
            icon,
            icon_color,
            label,
            value,
        }
    }

    fn render(self) -> Line<'static> {
        Line::from(vec![
            Span::raw("  "),
            Span::styled(self.icon, Style::default().fg(self.icon_color)),
            Span::raw(format!(" {}{}", self.label, self.value)),
        ])
    }
}