use std::path::PathBuf;
use clap::{ArgGroup, Parser, ValueEnum};
#[derive(Debug, Parser)]
#[command(
name = "deepshrink",
version,
about = "Shrink media to a target size with one command — local, private, no watermarks.",
long_about = None,
)]
#[command(group(ArgGroup::new("size").args(["target", "reduce", "for_preset"])))]
pub struct Cli {
#[arg(required = true, value_name = "INPUT")]
pub inputs: Vec<PathBuf>,
#[arg(long, value_name = "SIZE")]
pub target: Option<String>,
#[arg(long, value_name = "PCT")]
pub reduce: Option<String>,
#[arg(long = "for", value_name = "PRESET")]
pub for_preset: Option<String>,
#[arg(long, value_enum)]
pub codec: Option<VideoCodec>,
#[arg(long, value_name = "RES", default_value = "auto")]
pub resolution: String,
#[arg(long, value_name = "FPS", default_value = "auto")]
pub fps: String,
#[arg(long, value_name = "SPEC", default_value = "keep")]
pub audio: String,
#[arg(long, value_name = "N")]
pub vmaf: Option<f64>,
#[arg(long = "audio-codec", value_enum)]
pub audio_codec: Option<AudioCodec>,
#[arg(long)]
pub mono: bool,
#[arg(long = "sample-rate", value_name = "HZ", default_value = "auto")]
pub sample_rate: String,
#[arg(long)]
pub vbr: bool,
#[arg(long, value_enum, default_value_t = Quality::Balanced)]
pub quality: Quality,
#[arg(long, value_name = "PATH")]
pub output: Option<PathBuf>,
#[arg(long)]
pub overwrite: bool,
#[arg(long)]
pub recursive: bool,
#[arg(long = "dry-run")]
pub dry_run: bool,
#[arg(long)]
pub json: bool,
#[arg(short, long)]
pub quiet: bool,
#[arg(short, long)]
pub verbose: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum VideoCodec {
#[value(name = "h264")]
H264,
#[value(name = "h265")]
H265,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum AudioCodec {
Aac,
Opus,
Mp3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum Quality {
Fast,
Balanced,
Max,
}