use chrono::NaiveDate;
use clap::{Args, Parser, Subcommand};
use std::path::PathBuf;
const BEFORE_HELP: &str = "\n
gitlab-time-report exports time logs from Issues and Merge Requests of a GitLab repository \
to create statistics and charts of your working hours. Use --help on commands to get more information. \
If no subcommand is used, statistics will be printed directly to your console.";
const AFTER_HELP: &str = "By default, validation of time logs is enabled. \
It checks for excessive hours, future dates, duplicate time logs and missing summaries.
If a time log violates any of these rules, it is printed to the console. \
No automatic correction is performed. You can display the full validation results with --validation-details.";
#[derive(Parser)]
#[command(version, about, before_help = BEFORE_HELP, after_help = AFTER_HELP,
arg_required_else_help = true, subcommand_precedence_over_arg = true
)]
pub(super) struct Arguments {
#[arg(value_name = "URLs", value_delimiter = ' ', env = "GITLAB_URL")]
pub(super) url: Vec<String>,
#[arg(short, long, env = "GITLAB_TOKEN")]
pub(super) token: Option<String>,
#[arg(short, long, value_delimiter = ',', env = "GITLAB_LABELS")]
pub(super) labels: Vec<String>,
#[arg(long)]
pub(super) validation_details: bool,
#[arg(long, default_value = "10")]
pub(super) validation_max_hours: u16,
#[command(subcommand)]
pub(super) command: Option<Command>,
}
#[derive(Subcommand)]
pub(super) enum Command {
Export {
#[arg(short, long, default_value = "timelogs.csv")]
output: PathBuf,
},
Charts {
#[command(flatten)]
chart_options: ChartOptionsArgs,
},
Dashboard {
#[command(flatten)]
chart_options: ChartOptionsArgs,
},
}
#[derive(Args)]
#[clap(disable_help_flag = true)]
pub(super) struct ChartOptionsArgs {
#[arg(short, long, default_value = "800")]
pub(super) width: u16,
#[arg(short, long, default_value = "480")]
pub(super) height: u16,
#[arg(long, value_name = "PATH_TO_THEME_JSON", env)]
pub(super) theme_json: Option<PathBuf>,
#[arg(short, long, default_value = "charts")]
pub(super) output: PathBuf,
#[arg(long, value_name = "NUMBER_OF_SPRINTS", env)]
pub(super) sprints: u16,
#[arg(long, env)]
pub(super) weeks_per_sprint: u16,
#[arg(long, env)]
pub(super) hours_per_person: f32,
#[arg(long, value_name = "YYYY-MM-DD")]
pub(super) start_date: Option<NaiveDate>,
#[clap(long, action = clap::ArgAction::HelpLong)]
help: Option<bool>,
}