use std::path::PathBuf;
use clap::Parser;
use crate::explain::Format;
use crate::pattern;
use crate::pulse::HeartbeatOpts;
#[derive(Parser, Debug)]
#[command(
name = "ct-tree",
version,
about = "Report a file tree with per-file line/word/char counts, filtered, sorted, and summarised.",
long_about = "ct-tree walks a directory for chosen file types and reports the effective tree with \
per-file line, word, and character counts (also reachable as `ct tree`). Filter by \
metric predicates (--min-lines etc.) and per-folder counts, sort by any column, and \
choose a summarisation level (--tree, --flat, --summary). See `ct-tree --explain` \
for agent-oriented documentation."
)]
#[command(group = clap::ArgGroup::new("output_mode")
.args(["tree", "flat", "summary"])
.multiple(false))]
pub struct Cli {
#[arg(long, default_value = ".")]
pub base: PathBuf,
#[arg(long)]
pub name: Option<String>,
#[arg(long, value_enum)]
pub mode: Option<pattern::Mode>,
#[arg(long, value_delimiter = ',')]
pub ext: Vec<String>,
#[arg(long)]
pub hidden: bool,
#[arg(long)]
pub follow: bool,
#[arg(long)]
pub no_ignore: bool,
#[arg(long)]
pub min_lines: Option<u64>,
#[arg(long)]
pub max_lines: Option<u64>,
#[arg(long)]
pub min_words: Option<u64>,
#[arg(long)]
pub max_words: Option<u64>,
#[arg(long)]
pub min_chars: Option<u64>,
#[arg(long)]
pub max_chars: Option<u64>,
#[arg(long)]
pub min_files_per_folder: Option<usize>,
#[arg(long)]
pub max_files_per_folder: Option<usize>,
#[arg(long, value_enum, default_value_t = SortKey::Path)]
pub sort: SortKey,
#[arg(long)]
pub desc: bool,
#[arg(long)]
pub tree: bool,
#[arg(long)]
pub flat: bool,
#[arg(long)]
pub summary: bool,
#[arg(long, value_enum, default_value_t = GroupBy::Ext)]
pub group: GroupBy,
#[arg(long)]
pub json: bool,
#[arg(long)]
pub json_pretty: bool,
#[arg(long, value_name = "SECS")]
pub timeout: Option<f64>,
#[command(flatten)]
pub heartbeat: HeartbeatOpts,
#[arg(long, value_enum, num_args = 0..=1, default_missing_value = "md")]
pub explain: Option<Format>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
pub enum SortKey {
Path,
Name,
Lines,
Words,
Chars,
Ext,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
pub enum GroupBy {
Ext,
Dir,
None,
}