use std::path::PathBuf;
use clap::Parser;
use super::version_string;
#[derive(Parser)]
#[command(
name = "holos cover",
version = version_string(),
about = "Certify a minimum-cost failure-tolerant relative coverage plan",
after_help = "Physical coverage is conditional on the controlled-boundary domain and sensor-placement assumptions. STATES is `all` or a comma-separated state-index list. Check the result with: holos-check ARTIFACT"
)]
pub(crate) struct CoverageCli {
pub(crate) output: PathBuf,
#[arg(long = "state", value_name = "GRAPH", required = true)]
pub(crate) states: Vec<PathBuf>,
#[arg(long = "coordinates", value_name = "POINTS")]
pub(crate) coordinates: Vec<PathBuf>,
#[arg(long, value_name = "N")]
pub(crate) vertices: usize,
#[arg(long, value_name = "R")]
pub(crate) broadcast_radius: f64,
#[arg(long, value_name = "R")]
pub(crate) sensing_radius: f64,
#[arg(long, value_name = "V0,V1,...", value_delimiter = ',', required = true)]
pub(crate) fence: Vec<usize>,
#[arg(long, value_name = "V0,V1,...", value_delimiter = ',')]
pub(crate) base: Vec<usize>,
#[arg(long, value_name = "V0,V1,...", value_delimiter = ',')]
pub(crate) failable: Vec<usize>,
#[arg(long, value_name = "F", default_value_t = 0)]
pub(crate) failure_budget: usize,
#[arg(long = "candidate", value_names = ["V", "COST", "STATES"], num_args = 3)]
pub(crate) candidates: Vec<String>,
#[arg(long, value_name = "N")]
pub(crate) max_activations: usize,
#[arg(long, value_name = "P", default_value_t = 2)]
pub(crate) modulus: u32,
#[arg(long, value_name = "N", default_value_t = 2_000_000)]
pub(crate) oracle_limit: usize,
#[arg(long, value_name = "N", default_value_t = 2_000_000)]
pub(crate) node_limit: usize,
#[arg(long, value_name = "N", default_value_t = 1)]
pub(crate) threads: usize,
#[arg(long, value_name = "BYTES", default_value_t = 1usize << 30)]
pub(crate) max_artifact_bytes: usize,
}
#[derive(Parser)]
#[command(
name = "holos cover-affine",
version = version_string(),
about = "Certify relative coverage over a complete affine communication schedule",
after_help = "Physical coverage is conditional on the controlled-boundary domain and sensor-placement assumptions. Affine edge weights need not have a Euclidean realization. STATES is `all` or a comma-separated compiled state-index list. Check the result with: holos-check ARTIFACT"
)]
pub(crate) struct AffineCoverageCli {
pub(crate) input: PathBuf,
pub(crate) output: PathBuf,
#[arg(long, value_name = "N")]
pub(crate) vertices: usize,
#[arg(long)]
pub(crate) start: f64,
#[arg(long)]
pub(crate) end: f64,
#[arg(long, value_name = "R")]
pub(crate) broadcast_radius: f64,
#[arg(long, value_name = "R")]
pub(crate) sensing_radius: f64,
#[arg(long, value_name = "V0,V1,...", value_delimiter = ',', required = true)]
pub(crate) fence: Vec<usize>,
#[arg(long, value_name = "V0,V1,...", value_delimiter = ',')]
pub(crate) base: Vec<usize>,
#[arg(long, value_name = "V0,V1,...", value_delimiter = ',')]
pub(crate) failable: Vec<usize>,
#[arg(long, value_name = "F", default_value_t = 0)]
pub(crate) failure_budget: usize,
#[arg(long = "candidate", value_names = ["V", "COST", "STATES"], num_args = 3)]
pub(crate) candidates: Vec<String>,
#[arg(long, value_name = "N")]
pub(crate) max_activations: usize,
#[arg(long, value_name = "P", default_value_t = 2)]
pub(crate) modulus: u32,
#[arg(long, value_name = "N", default_value_t = 2_000_000)]
pub(crate) oracle_limit: usize,
#[arg(long, value_name = "N", default_value_t = 2_000_000)]
pub(crate) node_limit: usize,
#[arg(long, value_name = "BYTES", default_value_t = 1usize << 30)]
pub(crate) max_artifact_bytes: usize,
}