"""IMM0008 checksum interoperability against official Adobe-authored packets."""
import base64
import hashlib
from pathlib import Path
import unittest

import pikepdf
from lxml import etree as E
from imm0008_xfa_checksum import form_checksum, checksum_bytes

BASE = Path(__file__).resolve().parents[2]


class IMM0008ChecksumTest(unittest.TestCase):
    def test_official_english_and_french_checksums_match_exactly(self):
        for language, expected in [('e', 'a7xNsW5Pz4r2vd1NGnvVOc4KJfI='),
                                   ('f', 'aEZAtmElexza75+e3Z+reGq8d20=')]:
            with pikepdf.open(BASE / 'storage/app/imm' / ('imm0008'+language+'.pdf')) as pdf:
                xfa = pdf.Root.AcroForm.XFA
                packets = {str(xfa[i]): xfa[i+1].read_bytes() for i in range(0, len(xfa), 2)}
            self.assertEqual(E.fromstring(packets['form']).get('checksum'), expected)
            self.assertEqual(form_checksum(packets['template'], packets['datasets']), expected)

    def test_xml_normalization_preserves_xfa_entities_and_text(self):
        raw = b'\n<root a = \'&quot;&apos;&amp;&#13;\'>\n <child />\n<text> A &amp; B\r\n</text>\n</root>'
        expected = b'<root a="\"\'&amp;&#13;"><child></child><text> A &amp; B\r\n</text>\n</root>'
        self.assertEqual(checksum_bytes(raw), expected)
        self.assertEqual(form_checksum(raw, b'<data/>'),
                         base64.b64encode(hashlib.sha1(expected + b'<data></data>').digest()).decode('ascii'))

    def test_processing_instructions_keep_attributes_and_target_data(self):
        self.assertEqual(checksum_bytes(b'<r><?pi a="x"?><?designer expand 1?></r>'),
                         b'<r><?pi a="x" ?><?designer expand 1?></r>')
