use std::path::PathBuf;
use clap::{Args, Subcommand};
use rust_decimal::Decimal;
use szamlazz_agent::ops::credit_entry::{CreditEntries, CreditEntry, RegisterCreditEntry};
use szamlazz_agent::types::PaymentMethod;
use crate::output;
#[derive(Debug, Subcommand)]
pub enum PaymentCommand {
Register(RegisterArgs),
}
#[derive(Debug, Args)]
pub struct RegisterArgs {
number: String,
#[arg(short = 'f', long = "file", conflicts_with_all = ["date", "method", "amount", "description"])]
file: Option<PathBuf>,
#[arg(long, requires = "method", requires = "amount")]
date: Option<jiff::civil::Date>,
#[arg(long)]
method: Option<String>,
#[arg(long)]
amount: Option<Decimal>,
#[arg(long)]
description: Option<String>,
#[arg(long)]
additive: bool,
#[arg(long)]
tax_number: Option<String>,
}
pub async fn run(cli: &crate::Cli, command: &PaymentCommand) -> anyhow::Result<()> {
let PaymentCommand::Register(args) = command;
let entries: Vec<CreditEntry> = match (&args.file, args.date) {
(Some(file), _) => output::read_json_input(file)?,
(None, Some(date)) => {
let method = args.method.clone().expect("clap requires --method");
let amount = args.amount.expect("clap requires --amount");
let mut entry = CreditEntry::new(date, PaymentMethod::from(method), amount);
entry.description.clone_from(&args.description);
vec![entry]
}
(None, None) => anyhow::bail!("pass -f entries.json or --date/--method/--amount"),
};
let mut request = RegisterCreditEntry::new(args.number.as_str());
request.issuer_tax_number = args.tax_number.clone();
request.additive = args.additive;
request.entries = CreditEntries::try_from(entries)?;
let client = crate::client(cli)?;
let result = client.send(&request).await?;
if cli.json {
return output::json(&result);
}
output::field_required("Invoice number", &result.invoice_number);
output::field("Gross total", result.gross_total.as_ref());
output::field("Outstanding", result.outstanding.as_ref());
output::field("Payment method", result.payment_method.as_ref());
Ok(())
}