use clap::Parser;
use crate::hash::HashAlgo;
use crate::output::OutputFormat;
use crate::DEFAULT_BUFFER_SIZE;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
pub struct Cli {
#[arg(long, value_enum, default_value_t = HashAlgo::Blake3)]
pub algo: HashAlgo,
#[arg(long, value_enum, default_value_t = OutputFormat::Jsonl)]
pub format: OutputFormat,
#[arg(long, default_value_t = DEFAULT_BUFFER_SIZE, value_parser = parse_size)]
pub buffer_size: usize,
#[arg(long)]
pub no_fail: bool,
#[arg(long)]
pub init_sql: bool,
#[arg(long, value_enum)]
pub global_hash: Option<HashAlgo>,
#[arg(long)]
pub summary_out: Option<std::path::PathBuf>,
}
fn parse_size(s: &str) -> Result<usize, String> {
let trimmed = s.trim();
let (num, multiplier) = if let Some(stripped) =
trimmed.strip_suffix(|c: char| c.eq_ignore_ascii_case(&'k'))
{
(stripped, 1024)
} else if let Some(stripped) = trimmed.strip_suffix(|c: char| c.eq_ignore_ascii_case(&'m')) {
(stripped, 1024 * 1024)
} else if let Some(stripped) = trimmed.strip_suffix(|c: char| c.eq_ignore_ascii_case(&'g')) {
(stripped, 1024 * 1024 * 1024)
} else {
(trimmed, 1)
};
num.parse::<usize>()
.map(|n| n * multiplier)
.map_err(|_| format!("Invalid size '{}'", s))
}