from pathlib import Path
import argparse, hashlib, io, json
from PIL import Image
ROOT=Path(__file__).resolve().parent
parser=argparse.ArgumentParser();parser.add_argument('--results');args=parser.parse_args()
manifest=json.loads((ROOT/'input-manifest.json').read_text())
checked=[]
for row in manifest:
 path=ROOT/row['file']; raw=path.read_bytes()
 assert hashlib.sha256(raw).hexdigest()==row['sha256'], f'Input changed: {path}'
 if row.get('invalid_fixture'):
  try: Image.open(io.BytesIO(raw)).load()
  except Exception: checked.append({'file':row['file'],'expected_invalid':True});continue
  raise AssertionError('Broken image fixture unexpectedly decodes')
 im=Image.open(io.BytesIO(raw));im.load()
 assert list(im.size)==row['size']
 checked.append({'file':row['file'],'size':list(im.size),'mode':im.mode})
if (ROOT/'points.json').exists():
 points=json.loads((ROOT/'points.json').read_text());im=Image.open(ROOT/'flatlay.png')
 assert len(points['coords'])==len(points['labels'])>0
 assert all(0<=x<im.width and 0<=y<im.height for x,y in points['coords'])
 assert all(label in (0,1) for label in points['labels'])
if args.results:
 target=Path(args.results);target=target if target.is_absolute() else ROOT/target
 assert target.is_dir(), f'Results missing: {target}'
 files=sorted(target.glob('*.png'));assert files, 'No real result PNGs; model has not been run'
 for path in files:
  im=Image.open(path);im.load();record={'file':str(path.relative_to(ROOT)),'size':list(im.size),'mode':im.mode}
  if im.mode=='RGBA':
   alpha=im.getchannel('A');hist=alpha.histogram();record.update(alpha_range=list(alpha.getextrema()),transparent=hist[0],opaque=hist[255],soft=sum(hist[1:255]))
  checked.append(record)
report={'input_checks':checked,'model_inference_proven':False,'scope':'File structure only; visual/model run records are separate.'}
dump=ROOT/('results-verification.json' if args.results else 'verification.json')
dump.write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n')
print(json.dumps({'checked':len(checked),'report':dump.name},ensure_ascii=False))
