"""Python standard library. Recalculate dataset summaries and verify the frozen PDF bytes.
This does not independently parse PDF objects, inspect ink bounds or test a printer.
"""
import hashlib
import json
from pathlib import Path
import zipfile

root = Path(__file__).resolve().parent
data = json.loads((root / 'dataset.json').read_text())['rows']
results = json.loads((root / 'results.json').read_text())
assert len(data) == results['pdfFiles'] == 48
assert len({r['assetId'] for r in data}) == results['illustrations'] == 24
assert len({(r['assetId'], r['paper']) for r in data}) == 48
with zipfile.ZipFile(root / 'print-samples.zip') as archive:
    assert archive.testzip() is None
    assert len(archive.namelist()) == len(data)
    for row in data:
        filename = row['assetId'] + '-' + row['paper'] + '.pdf'
        assert hashlib.sha256(archive.read(filename)).hexdigest() == row['pdfSha256']
        w, h = row['artworkCanvasWidthPoints'], row['artworkCanvasHeightPoints']
        assert abs(w / h - row['svgWidth'] / row['svgHeight']) < 1e-6
        assert abs(min(row['canvasMarginsPoints'].values()) - row['minimumCanvasMarginPoints']) < 1e-9
        assert row['minimumCanvasMarginPoints'] >= 35.99
minimum = min(r['minimumCanvasMarginPoints'] for r in data)
assert minimum == results['minimumCanvasMarginPoints']
paired = {paper: next(r for r in data if r['paper'] == paper) for paper in ['a4', 'letter']}
ratio = paired['letter']['artworkCanvasWidthPoints'] / paired['a4']['artworkCanvasWidthPoints']
assert abs(ratio - results['letterToA4ArtworkWidthRatio']) < 1e-9
print(json.dumps({'verifiedSampleHashes': len(data), 'minimumCanvasMarginPoints': minimum,
                  'letterToA4ArtworkWidthRatio': ratio, 'physicalPrinterTest': False}))
