use clap::{Args, Parser, ValueEnum};
use std::path::PathBuf;
const AUTHORS: &str = "Tony Kan, Ted Yu, William A. Goddard III";
const ABOUT: &str =
"A command-line tool for calculating dynamic partial atomic charges using the QEq method.";
const COPYRIGHT: &str = "Copyright (c) 2025 California Institute of Technology, Materials and Process Simulation Center (MSC)";
const HELP_TEMPLATE: &str = "\
{before-help}{name} {version}
{author-with-newline}{about-with-newline}
{usage-heading} {usage}
{all-args}{after-help}
";
#[derive(Parser)]
#[command(
author = AUTHORS,
version,
about = ABOUT,
after_help = COPYRIGHT,
help_template = HELP_TEMPLATE,
)]
#[command(propagate_version = true)]
pub struct Cli {
#[arg(value_name = "INPUT")]
pub input: String,
#[command(flatten)]
pub output: OutputOptions,
#[command(flatten)]
pub calculation: CalculationOptions,
#[command(flatten)]
pub solver: SolverOptions,
}
#[derive(Args)]
#[command(next_help_heading = "Output Options")]
pub struct OutputOptions {
#[arg(short, long, value_name = "FILE")]
pub output: Option<PathBuf>,
#[arg(short, long, value_enum, default_value_t = OutputFormat::Pretty)]
pub format: OutputFormat,
#[arg(short, long, default_value_t = 6)]
pub precision: usize,
}
#[derive(Args)]
#[command(next_help_heading = "Calculation Options")]
pub struct CalculationOptions {
#[arg(short = 'P', long, value_name = "FILE")]
pub params: Option<PathBuf>,
#[arg(short = 'q', long, default_value_t = 0.0)]
pub total_charge: f64,
}
#[derive(Args)]
#[command(next_help_heading = "Solver Options")]
pub struct SolverOptions {
#[arg(long, default_value_t = 1e-6)]
pub tolerance: f64,
#[arg(long, default_value_t = 100)]
pub max_iterations: u32,
#[arg(long, default_value_t = 0.5)]
pub lambda_scale: f64,
#[arg(long, default_value_t = true, action = clap::ArgAction::Set)]
pub hydrogen_scf: bool,
#[arg(long, value_enum, default_value_t = CliBasisType::Sto)]
pub basis: CliBasisType,
#[arg(long, value_enum, default_value_t = CliDampingStrategy::Auto)]
pub damping: CliDampingStrategy,
#[arg(long, default_value_t = 0.4)]
pub damping_factor: f64,
}
#[derive(Clone, ValueEnum)]
pub enum OutputFormat {
Pretty,
Xyz,
Csv,
Json,
}
#[derive(Clone, ValueEnum)]
pub enum CliBasisType {
Sto,
Gto,
}
#[derive(Clone, ValueEnum)]
pub enum CliDampingStrategy {
Auto,
Fixed,
None,
}