use anyhow::{Result, bail};
use xark_ir::primitive::VarRole;
use super::{
CheckArgs, load_circuit_program, load_profile, parse_inputs_arg, resolve_input_ids,
soundness_check,
};
use crate::xark_project::XarkProject;
pub fn run(args: CheckArgs) -> Result<()> {
let mut build_argv = vec![args.crate_dir.clone()];
if let Some(out) = &args.out {
build_argv.push("--out".into());
build_argv.push(out.clone());
}
let code = crate::cli::cmd_build(&build_argv);
if code != 0 {
bail!("build failed (exit {code}); fix the circuit before `xark check --inputs`");
}
let base = args.out.clone().unwrap_or_else(|| args.crate_dir.clone());
let project = XarkProject::resolve(Some(base.into()))?;
let cp = load_circuit_program(&project.circuit_xbc())?;
let profile = load_profile(&project.xark_dir);
let arg = args
.inputs
.as_deref()
.expect("check::run is only reached with --inputs");
let inputs = parse_inputs_arg(arg)?;
let id_inputs = resolve_input_ids(&cp.vars, &inputs)?;
let _assign = soundness_check(&cp, profile.as_ref(), &id_inputs)?;
let derived = cp
.vars
.iter()
.filter(|v| matches!(v.role, VarRole::Derived))
.count();
println!(
"{}",
crate::style::brand(&format!(
"✅ circuit sound: no under-constrained variables ({derived} derived vars checked)"
))
);
Ok(())
}