//! Conformance corpus for sink energy (`live-conformance/sink-energy/`,
//! extensions/sink-energy.md §9).
//!
//!   wai_sink_energy_vectors gen     <corpus-dir>   write vectors.json, from fixed seeds
//!   wai_sink_energy_vectors verify  <corpus-dir>   vectors.json regenerates byte for byte,
//!                                                  every case gets the outcome it states, every
//!                                                  reason of §8 refuses a case, and every
//!                                                  measured table under tables/ is accepted
//!
//! The generator and this verifier are one implementation. The corpus's second
//! implementation is `live-conformance/sink_energy_verify.py`, written from the extension's
//! text and sharing no code with this binary.

use std::path::Path;
use wai::sink_energy::corpus;

fn main() {
    let a: Vec<String> = std::env::args().collect();
    match (a.get(1).map(String::as_str), a.get(2)) {
        (Some("gen"), Some(d)) => {
            let p = Path::new(d).join("vectors.json");
            if let Err(e) = std::fs::create_dir_all(d).and_then(|_| std::fs::write(&p, corpus::generate())) {
                eprintln!("write {}: {e}", p.display());
                std::process::exit(1);
            }
            println!("wrote {}", p.display());
        }
        (Some("verify"), Some(d)) => {
            let dir = Path::new(d);
            let same = std::fs::read_to_string(dir.join("vectors.json")).is_ok_and(|s| s == corpus::generate());
            println!("{} vectors.json regenerates byte for byte from its seeds", if same { "PASS" } else { "FAIL" });
            let fails = corpus::verify(dir);
            for f in &fails {
                println!("FAIL {f}");
            }
            println!("{} every case, every reason and every measured table", if fails.is_empty() { "PASS" } else { "FAIL" });
            std::process::exit((!same || !fails.is_empty()) as i32);
        }
        _ => {
            eprintln!("usage: wai_sink_energy_vectors gen|verify <corpus-dir>");
            std::process::exit(2);
        }
    }
}
