"""Build deployment assets from the supplied PDF. Runtime rendering uses PHP only."""
import hashlib
import json
import re
import sys
from pathlib import Path
from pypdf import PdfReader, PdfWriter
from pypdf.generic import NameObject, DictionaryObject, DecodedStreamObject, ArrayObject
from pypdf._codecs.core_font_metrics import CORE_FONT_METRICS
import pypdf._codecs.core_font_metrics as metrics_module

source = Path(sys.argv[1])
destination = Path(__file__).resolve().parents[1] / 'resources/pdf'
destination.mkdir(exist_ok=True)
reader = PdfReader(source)
assert len(reader.pages) == 1
keys = ['nombres_completos','tipo_identificacion','numero_identificacion','lugar_nacimiento','fecha_nacimiento','nacionalidad','direccion_domicilio','ciudad','pais','telefono_domicilio','celular','correo','estado_civil','conyuge_nombres','conyuge_tipo_identificacion','conyuge_numero_identificacion','conyuge_nacionalidad','actividad_economica','profesion','fuente_ingresos','cargo','actividad_empresa','direccion_empresa','ciudad_empresa','pais_empresa','telefonos_empresa','ingresos_mensuales','otros_ingresos','egresos_mensuales','fuente_otros_ingresos','total_activos','total_pasivos','es_pep','pep_vinculo','pep_nombre','pep_cargo','pep_institucion','lugar_firma','firma_dia','firma_mes','firma_anio','firma']
annotations = reader.pages[0]['/Annots']
assert len(keys) == len(annotations)
fields = {key: {'label': annotation.get_object()['/T'], 'rect': [float(v) for v in annotation.get_object()['/Rect']]} for key, annotation in zip(keys, annotations)}
writer = PdfWriter()
writer.add_page(reader.pages[0])
page = writer.pages[0]
del page['/Annots']
font = writer._add_object(DictionaryObject({NameObject('/Type'):NameObject('/Font'), NameObject('/Subtype'):NameObject('/Type1'), NameObject('/BaseFont'):NameObject('/Helvetica'), NameObject('/Encoding'):NameObject('/WinAnsiEncoding')}))
page['/Resources']['/Font'][NameObject('/FilledFont')] = font
overlay = DecodedStreamObject(); overlay.set_data(b'')
overlay_ref = writer._add_object(overlay)
original = page.raw_get('/Contents')
page[NameObject('/Contents')] = ArrayObject([*original, overlay_ref] if isinstance(original, ArrayObject) else [original, overlay_ref])
path = destination / 'natural-client-template.pdf'
writer.write(path)
pdf = path.read_bytes()
parsed = PdfReader(path)
widths = CORE_FONT_METRICS['Helvetica'].character_widths
manifest = {'source_sha256': hashlib.sha256(source.read_bytes()).hexdigest(), 'template_sha256': hashlib.sha256(pdf).hexdigest(), 'stream_id': overlay_ref.idnum, 'root_id': parsed.trailer.raw_get('/Root').idnum, 'size': parsed.trailer['/Size'], 'previous_xref': int(re.search(rb'startxref\s+(\d+)\s+%%EOF\s*$',pdf)[1]), 'fields': fields, 'widths': {str(i): widths.get(bytes([i]).decode('cp1252',errors='replace'),556) for i in range(256)}}
(destination / 'natural-client-template.json').write_text(json.dumps(manifest,ensure_ascii=False,indent=2),encoding='utf-8')
# Retain all upstream font metric copyright notices with the derived width table.
(destination / 'font-metrics-license.txt').write_text('\n'.join(line for line in Path(metrics_module.__file__).read_text().splitlines() if line.lstrip().startswith('#')),encoding='utf-8')
print('Prepared template and',len(fields),'field positions')
