"""Verify actual IMM5708 dataset paths and draft values, without claiming Adobe validation.

Usage: python verify_imm5708_pdf.py <directory containing *-en.json/*-fr.json payloads>
"""
import hashlib
import json
from pathlib import Path
import sys

from prefill_imm_xfa_pdf import fill, find_by_path
from verify_imm5257_pdf import datasets


def verify(directory):
    base = Path(__file__).resolve().parents[2]
    report = []
    for payload_path in sorted(Path(directory).glob('*.json')):
        payload = json.loads(payload_path.read_text(encoding='utf-8'))
        if payload.get('form') != 'IMM5708':
            continue
        lang = payload['language']
        blank = base / f'storage/app/imm/imm5708{"f" if lang == "fr" else "e"}.pdf'
        original_hash = hashlib.sha256(blank.read_bytes()).hexdigest()
        contract = json.loads((base / f'resources/imm/imm5708-contract.{lang}.json').read_text(encoding='utf-8'))
        root = datasets(str(blank))
        for target in contract['fields']:
            assert len(find_by_path(root, target)) == 1, target
        assert payload['coverage']['filled'] == len(payload['fields'])
        for target, value in payload['fields'].items():
            assert target in contract['fields'], target
            meta = contract['fields'][target]
            assert 'max_chars' not in meta or len(value) <= meta['max_chars'], target
            choices = dict(meta.get('choices', {}), **meta.get('state_choices', {}))
            assert not choices or value in choices, (target, value)
            assert not any(s in target for s in ['CertificateIssueDate', 'TextField2', 'SignatureField', 'ValidatedFlag']), target
        output = payload_path.with_suffix('.pdf')
        fill(str(payload_path), str(output), str(blank))
        written = datasets(str(output))
        for target, value in payload['fields'].items():
            nodes = find_by_path(written, target)
            assert len(nodes) == 1 and nodes[0].text == value, (target, value)
        assert hashlib.sha256(blank.read_bytes()).hexdigest() == original_hash
        report.append(dict(payload=payload_path.name, targets=len(contract['fields']), values=len(payload['fields']), mismatches=0))
    assert report, 'No IMM5708 payloads found'
    return dict(pdfs=len(report), written_values=sum(r['values'] for r in report), mismatches=0, results=report)


if __name__ == '__main__':
    result = verify(sys.argv[1])
    (Path(sys.argv[1]) / 'pdf-verification.json').write_text(json.dumps(result, indent=2)+'\n', encoding='utf-8')
    print(json.dumps(result))
