import { PDFNet } from "@pdftron/pdfnet-node";

export const TimestampAndEnableLTV = async (
  docBuffer: ArrayBuffer,
  certPath: string,
  certTSAUrl: string,
  imgBytes: ArrayBuffer,
  coords: any
): Promise<ArrayBuffer> => {
  const doc = await PDFNet.PDFDoc.createFromBuffer(docBuffer);
  doc.initSecurityHandler();
  const tst_config = await PDFNet.TimestampingConfiguration.createFromURL(
    certTSAUrl
  );
  const opts = await PDFNet.VerificationOptions.create(
    PDFNet.VerificationOptions.SecurityLevel.e_compatibility_and_archiving
  );

  await opts.addTrustedCertificateUString(certPath);

  const img = await PDFNet.Image.createFromMemory2(doc, imgBytes);

  //make this dynamic with canvas lib
  const imgWidth = 300;
  const imgHeight = 300;

  const pagesForSining = Object.keys(coords).map((k) => {
    return parseInt(k);
  });

  const pages = await doc.getPageCount();
  let result;
  for (let p = 1; p <= pages; p++) {
    if (!pagesForSining.includes(p)) {
      continue;
    }
    const page = await doc.getPage(p);

    const doctimestamp_signature_field =
      await doc.createDigitalSignatureField();

    const widgetAnnot =
      await PDFNet.SignatureWidget.createWithDigitalSignatureField(
        doc,
        new PDFNet.Rect(
          parseFloat(coords[p].x),
          parseFloat(coords[p].x + imgWidth),
          parseFloat(coords[p].y),
          parseFloat(coords[p].y + imgHeight)
        ),
        doctimestamp_signature_field
      );

    await page.annotPushBack(widgetAnnot);
    await widgetAnnot.createSignatureAppearance(img);
    await doctimestamp_signature_field.timestampOnNextSave(tst_config, opts);

    result = await doc.saveMemoryBuffer(
      PDFNet.SDFDoc.SaveOptions.e_incremental
    );
  }

  return result.buffer;
};