# Cross-process extension replay with full semantic graph and query comparisons.
import argparse
import json
import os
from pathlib import Path
import subprocess
import sys
import tempfile

CHILD = '''
import sys,json,hashlib
from pathlib import Path
from hearth_extensions.programs import extension_scene,perimeter_cluster
from hearth_extensions.assessment import signatures
from hearth.persistence import export_scene,load_scene,semantic_digest,encode
scene=extension_scene(perimeter_cluster,int(sys.argv[1]),int(sys.argv[2]))
p=next(p for p,c in sorted(scene.blocks.items()) if c.state=='minecraft:glass' and 'facade' in c.owner)
query=scene.inspect(p)
nodes=json.dumps(encode(scene.nodes),sort_keys=True,separators=(',',':'))
output=Path(sys.argv[3]);export_scene(scene,output)
restored=load_scene(output)
assert restored.inspect(p)==query
assert encode(restored.nodes)==encode(scene.nodes)
print(json.dumps({'digest':semantic_digest(scene),'principal':signatures(scene)['principal_signature'],'nodes_digest':hashlib.sha256(nodes.encode()).hexdigest(),'nodes':len(scene.nodes),'glass_query':query},default=lambda v:sorted(v),sort_keys=True))
'''


def replay(seed, environment_seed, output):
    root = Path(__file__).resolve().parents[1]
    rows = []
    with tempfile.TemporaryDirectory(dir=root / 'test', prefix='tmp-extension-replay-') as temporary:
        for hash_seed in ('5', '918273'):
            artifact = Path(temporary) / f'seed {seed} hash {hash_seed}.litematic'
            result = subprocess.run([sys.executable, '-c', CHILD, str(seed), str(environment_seed), str(artifact)], cwd=root, env=dict(os.environ, PYTHONHASHSEED=hash_seed), capture_output=True, text=True, check=True)
            rows.append({'PYTHONHASHSEED': hash_seed, 'result': json.loads(result.stdout)})
    if rows[0]['result'] != rows[1]['result']:
        raise AssertionError('Extension replay mismatch')
    output.parent.mkdir(parents=True, exist_ok=True)
    output.write_text(json.dumps({'verified': True, 'seed': seed, 'environment_seed': environment_seed, 'runs': rows}, indent=2))
    print('Verified extension content, nodes, signatures, glass query and paired reload across two Python hash seeds.')


if __name__ == '__main__':
    p = argparse.ArgumentParser()
    p.add_argument('--seed', type=int, default=3)
    p.add_argument('--environment-seed', type=int, default=7)
    p.add_argument('--output', type=Path, default=Path('reports/extension-corpus/replay.json'))
    a = p.parse_args()
    replay(a.seed, a.environment_seed, a.output)
