use crate::config::{set_fee_treatment, set_pre2025_method as config_set_pre2025_method};
use crate::render::write_csv_exports;
use crate::{require_attestation, CliConfig, CliError, Session};
use btctax_adapters::BundledTaxTables;
use btctax_core::{compute_se_tax, FeeTreatment, LotMethod, TaxTables};
use btctax_store::Passphrase;
use std::path::{Path, PathBuf};
pub fn show_config(vault_path: &Path, pp: &Passphrase) -> Result<CliConfig, CliError> {
Session::open(vault_path, pp)?.config()
}
pub fn set_config(
vault_path: &Path,
pp: &Passphrase,
fee_treatment: Option<FeeTreatment>,
) -> Result<CliConfig, CliError> {
let mut session = Session::open(vault_path, pp)?;
if let Some(t) = fee_treatment {
set_fee_treatment(session.conn(), t)?;
session.save()?;
}
session.config()
}
pub fn set_pre2025_method(
vault_path: &Path,
pp: &Passphrase,
m: LotMethod,
attested: bool,
) -> Result<CliConfig, CliError> {
let mut session = Session::open(vault_path, pp)?;
config_set_pre2025_method(session.conn(), m, attested)?;
session.save()?;
session.config()
}
pub fn export_snapshot(
vault_path: &Path,
pp: &Passphrase,
out_dir: &Path,
tax_year: Option<i32>,
attest: Option<&str>,
) -> Result<PathBuf, CliError> {
let session = Session::open(vault_path, pp)?;
let (state, _cfg) = session.project()?;
if state.pseudo_active() {
require_attestation(attest)?;
}
let sqlite = session.vault().export_snapshot(out_dir)?; let se_result = match tax_year {
Some(y) => {
let tables = BundledTaxTables::load();
session.tax_profile(y)?.and_then(|p| {
tables.table_for(y).and_then(|t| {
compute_se_tax(
&state,
y,
p.filing_status,
t,
p.w2_ss_wages,
p.w2_medicare_wages,
p.schedule_c_expenses,
)
})
})
}
None => None,
};
let donation_details = session.donation_details()?;
write_csv_exports(
out_dir,
&state,
tax_year,
se_result.as_ref(),
&donation_details,
)?;
Ok(sqlite)
}
pub fn export_pseudo_active(vault_path: &Path, pp: &Passphrase) -> Result<bool, CliError> {
let (state, _cfg) = Session::open(vault_path, pp)?.project()?;
Ok(state.pseudo_active())
}
pub fn backup_key(vault_path: &Path, pp: &Passphrase, out_path: &Path) -> Result<(), CliError> {
Session::open(vault_path, pp)?
.vault()
.backup_key(out_path)?;
Ok(())
}