#!/usr/bin/env python3
"""Prove the batch reports the real Spec snapshot gap and rejects extra defects."""
from copy import deepcopy
import json
from pathlib import Path
import shutil
import subprocess
import sys
import tempfile

if len(sys.argv)!=3:raise SystemExit('Expected B-runtime C-local-copy')
b,c=map(Path,sys.argv[1:]);report=json.loads((c/'report.json').read_text());responses=json.loads((c/'responses.json').read_text())
script=Path(__file__).with_name('compare.py');passed=[]
with tempfile.TemporaryDirectory(prefix='cdx-region-compare-') as tmp:
    target=Path(tmp)/'C';shutil.copytree(c,target)
    def execute(name,mutate_report=None,mutate_response=None,expect_gate=False,expect_region_difference=False):
        r=deepcopy(report);d=deepcopy(responses)
        if mutate_report:mutate_report(r)
        if mutate_response:mutate_response(d)
        (target/'report.json').write_text(json.dumps(r));(target/'responses.json').write_text(json.dumps(d,ensure_ascii=False))
        process=subprocess.run([sys.executable,str(script),str(b),str(target)],capture_output=True,text=True)
        if expect_gate:
            assert process.returncode!=0 and not process.stdout.startswith('{'),name
        else:
            result=json.loads(process.stdout)
            assert process.returncode!=0 and result['spec_nonempty_both_cases']==0,name
            region=[x for x in result['cases'] if '/Region/' in x['path']]
            if expect_region_difference:assert any(x['strict_differences'] for x in region),name
            else:assert all(x['strict_differences']==0 for x in region) and result['strict_equal_cases']==18,name
        passed.append(name)
    def case(r,name):return next(x for x in r['cases'] if x['scenario']==name)
    execute('baseline honestly rejects four Spec snapshot gaps; twelve Region cases equal')
    execute('cold proof missing',mutate_report=lambda r:case(r,'API_ALL_COLD').__setitem__('region_query_observations',0),expect_gate=True)
    execute('warm business SELECT not ignored',mutate_report=lambda r:case(r,'API_ALL_WARM').__setitem__('region_query_observations',1),expect_gate=True)
    execute('DML evidence rejected',mutate_report=lambda r:r.__setitem__('non_select_observed',1),expect_gate=True)
    execute('natural data changed rejected',mutate_report=lambda r:r.__setitem__('natural_unchanged',False),expect_gate=True)
    execute('Region name value difference',mutate_response=lambda d:next(iter(d['API_ALL_COLD']['body']['data']['list'].values())).__setitem__('name','CHANGED'),expect_region_difference=True)
    execute('Region parent number-to-string',mutate_response=lambda d:next(iter(d['API_ALL_COLD']['body']['data']['list'].values())).__setitem__('pid','0'),expect_region_difference=True)
    execute('required scenario missing',mutate_response=lambda d:d.pop('API_ALL_COLD'),expect_gate=True)
print(json.dumps({'tests':len(passed),'passed':passed,'private_temporary_copies_cleaned':True},indent=2))
