slashmail 0.1.0

CLI for searching, managing, and bulk-operating on emails via IMAP
use comfy_table::{presets::UTF8_FULL_CONDENSED, Cell, ContentArrangement, Table};

pub struct MessageRow {
    pub uid: u32,
    pub folder: Option<String>,
    pub from: String,
    pub subject: String,
    pub date: String,
    pub timestamp: i64,
    pub size: u32,
}

pub fn format_size(bytes: u64) -> String {
    if bytes >= 1_048_576 {
        format!("{:.1}M", bytes as f64 / 1_048_576.0)
    } else if bytes >= 1024 {
        format!("{:.0}K", bytes as f64 / 1024.0)
    } else {
        format!("{bytes}B")
    }
}

pub fn display_messages(messages: &[MessageRow]) {
    if messages.is_empty() {
        println!("No messages found.");
        return;
    }

    let has_folder = messages.iter().any(|m| m.folder.is_some());
    let mut table = Table::new();
    table.load_preset(UTF8_FULL_CONDENSED);
    table.set_content_arrangement(ContentArrangement::Dynamic);

    let mut header = vec!["UID", "From", "Subject", "Date", "Size"];
    if has_folder {
        header.insert(1, "Folder");
    }
    table.set_header(header);

    for msg in messages {
        let mut row: Vec<Cell> = vec![Cell::new(msg.uid)];
        if has_folder {
            row.push(Cell::new(msg.folder.as_deref().unwrap_or("")));
        }
        row.push(Cell::new(&msg.from));
        row.push(Cell::new(&msg.subject));
        row.push(Cell::new(&msg.date));
        row.push(Cell::new(format_size(msg.size as u64)));
        table.add_row(row);
    }

    println!("{table}");
    println!("{} message(s)", messages.len());
}