import subprocess, sys, os
ROOT = r'C:/Users/decid/Documents/projects/spt-core/.worktrees/351-w5/'
TW = 'crates/spt-store/src/trustwarn.rs'
NS = 'crates/spt/src/api/nowsignal.rs'
MUTS = [
    ("H1 message_ref takes the attribute raw", TW,
     b"    if let Some(id) = msg_id_attr.filter(|id| crate::msgid::is_short_id(id)) {",
     b"    if let Some(id) = msg_id_attr {",
     "-p spt-daemon -p spt --lib --bins", "a_forged_msg_id"),
    ("M2 seen key is the bare msg_id", TW,
     b'        format!("trust:{}:{}:{}", self.peer_kind, self.peer, self.msg_id)',
     b'        self.msg_id.clone()',
     "-p spt --bins", "one_message_id_on_two_peers_renders_both"),
    ("M3 reader reads a 64-record tail", TW,
     b"    crate::jsonltail::read_at(&records_file_at(perch_path), RECORD_KEEP)",
     b"    crate::jsonltail::read_at(&records_file_at(perch_path), 64)",
     "-p spt --bins", "a_pending_warning_older_than_64_records_still_renders"),
    ("M3 writer evicts oldest regardless", TW,
     b"    if records.len() >= RECORD_KEEP {",
     b"    if records.len() >= usize::MAX {",
     "-p spt --bins", "a_full_file_retires_rendered_records_before_a_pending_one"),
    ("M1 max_lines binds TRUST_WARNINGS", NS,
     b"        if cat == Category::TrustWarnings {\r\n            None\r\n        } else {\r\n            self.max_lines\r\n        }",
     b"        let _ = cat;\r\n        self.max_lines",
     "-p spt --bins", "a_spec_cannot_suppress_trust_warnings"),
    ("L2 lone CR not folded", NS,
     b"            .replace('\\r', \"\\n\")\r\n",
     b"",
     "-p spt --bins", "a_max_size_override_renders_whole_on_one_line"),
]
env = dict(os.environ, CARGO_TARGET_DIR=ROOT + 'target')
results = []
for name, path, old, new, pkgs, filt in MUTS:
    full = ROOT + path
    orig = open(full, 'rb').read()
    if orig.count(old) != 1:
        results.append((name, f"SKIP: anchor count {orig.count(old)}")); continue
    open(full, 'wb').write(orig.replace(old, new))
    try:
        cmd = ["cargo", "nextest", "run", "-j", "8", *pkgs.split(), "--no-fail-fast", "-E", f"test(/{filt}/)"]
        p = subprocess.run(cmd, cwd=ROOT, env=env, capture_output=True, text=True, encoding='utf-8', errors='replace')
        out = p.stdout + p.stderr
        summ = [l.strip() for l in out.splitlines() if 'Summary' in l or l.strip().startswith('FAIL') or 'error[' in l]
        results.append((name, f"rc={p.returncode} " + " | ".join(dict.fromkeys(summ))))
    finally:
        open(full, 'wb').write(orig)
subprocess.run("git status --porcelain", shell=True, cwd=ROOT)
for n, r in results:
    print(f"MUT {n}: {r}")
