#!/usr/bin/env python3
"""Verify required final asset inventory, native provenance and review bindings."""
import hashlib
import json
from collections import Counter
from pathlib import Path

from PIL import Image

BASE = Path(__file__).resolve().parents[1]
manifest = json.loads((BASE / 'manifests/media.json').read_text())
assets = manifest['assets']
assert len(assets) == 83
assert len({a['id'] for a in assets}) == 83
assert Counter(a['category'] for a in assets) == {'ads': 20, 'daily': 56, 'landing': 7}
expected = {str((BASE / 'site' / a['file']).resolve()) for a in assets}
actual = {str(p.resolve()) for category in ['ads', 'daily', 'landing'] for p in (BASE / 'site/assets' / category).glob('*.png')}
assert actual == expected, {'missing': sorted(expected - actual), 'extra': sorted(actual - expected)}
hashes = []
for a in assets:
    file = Path(a['absolute_file'])
    digest = hashlib.sha256(file.read_bytes()).hexdigest()
    assert digest == a['sha256'] == a['reviewed_sha256']
    hashes.append(digest)
    with Image.open(file) as image:
        assert image.format == 'PNG'
        assert image.size == (a['width'], a['height'])
        if a['category'] == 'ads' or a['kind'] == 'infographic':
            assert a['width'] == a['height']
        image.verify()
    assert a['review_state'] == 'PASS' and a['has_source']
    assert Path(a['source_file']).is_file()
    prompt = Path(a['prompt_path'])
    assert prompt.is_file() and prompt.read_text() == a['prompt']
    receipt = json.loads(Path(a['receipt_path']).read_text())
    assert receipt['provider'] == 'native image_gen.imagegen GPT image tool'
    assert receipt['model_version'] == 'not exposed by tool'
    assert receipt['sha256'] == digest == receipt['reviewed_sha256']
    native = Path(receipt['generation_output'])
    assert '/.codex/generated_images/' in str(native)
    assert native.is_file() and hashlib.sha256(native.read_bytes()).hexdigest() == digest
assert len(set(hashes)) == 83
daily = [a for a in assets if a['category'] == 'daily']
for day in range(1, 15):
    items = [a for a in daily if a['day'] == day]
    assert len(items) == 4
    assert {(a['kind'], a['variant']) for a in items} == {('infographic', 'a'), ('infographic', 'b'), ('image', 'a'), ('image', 'b')}
    assert [a['id'] for a in items if a['recommended']] == [f'day-{day:02}-infographic-a']
    assert {a['module'] for a in items} == {min((day + 1) // 2, 6)}
ad_specs = {a['id']: a for a in json.loads((BASE / 'drafts/ads-final.json').read_text())}
for a in assets:
    if a['category'] == 'ads':
        assert a['image_text'] == ad_specs[a['id']]['image_text']
        assert 9 <= sum(len(line.split()) for line in a['image_text']) <= 13
        assert 'Rita' not in a['review_text']
        assert a['review_text'].replace(' | ', '\n') == '\n'.join(a['image_text'] + ['Komplex Logopédia']), a['id']
result = {
    'status': 'PASS', 'total': 83, 'ads_square': 20, 'daily': 56,
    'daily_infographics_square': 28, 'landing': 7, 'distinct_sha256': 83,
    'daily_days': 14, 'alternatives_per_day': 4, 'recommended_infographic_a': 14,
    'native_output_hash_matches': 83, 'prompt_sidecars': 83,
    'receipt_sidecars': 83, 'individual_review_bindings': 83,
    'ads_exact_rendered_copy_with_brand': 20, 'ads_overlay_9_to_13_words_excluding_brand': 20,
    'scope': 'Files and individual raster/content QA. Parent owns deployed mobile QA.',
}
(BASE / 'evidence/media/integrity-verification.json').write_text(json.dumps(result, indent=2) + '\n')
print(json.dumps(result))
