"""Field-arm negative control: a bind failure LEAKS into the ready stretch
(the brain exits before stamping ready). apply/restore with sha256 assert."""
import hashlib, json, os, sys

F = 'crates/spt-daemon/src/brainproc.rs'
D = os.path.dirname(__file__)
STATE = os.path.join(D, 'mut2-state.json')
BAK = os.path.join(D, 'mut2-brainproc.bak')
sha = lambda b: hashlib.sha256(b).hexdigest()

if sys.argv[1] == 'apply':
    assert not os.path.exists(STATE), 'already applied'
    raw = open(F, 'rb').read()
    open(BAK, 'wb').write(raw)
    json.dump({'sha': sha(raw)}, open(STATE, 'w'))
    old = b'if let Some(port) = crate::docshost::start_daemon_serving(name.clone()) {'
    new = (b'let Some(port) = crate::docshost::start_daemon_serving(name.clone()) else '
           b'{ return Err(io::Error::other("W9-NEG: bind failure leaked into readiness")); }; {')
    assert raw.count(old) == 1
    open(F, 'wb').write(raw.replace(old, new))
    print('MUTANT2 APPLIED', sha(raw))
else:
    want = json.load(open(STATE))['sha']
    open(F, 'wb').write(open(BAK, 'rb').read())
    got = sha(open(F, 'rb').read())
    assert got == want, (got, want)
    os.remove(STATE)
    print('RESTORED2, sha256 match', got)
