import verifyPDF from "@ninja-labs/verify-pdf";
import { PdfData } from "pdfdataextract";
import { config } from "./config";
import { IgetMetaResponse } from "./types";
const { PDFDocument } = require("pdf-lib");

class PDFparser {
  readonly document;
  readonly config;

  constructor(document: Buffer) {
    this.document = document;
    this.config = config;
  }

  getPDFMeta = async (): Promise<IgetMetaResponse> => {
    try {
      const pdfMeta = await PdfData.extract(this.document, config);
      const signaturesMeta = await verifyPDF(this.document);

      return {
        verified: signaturesMeta.verified,
        authenticity: signaturesMeta.authenticity,
        integrity: signaturesMeta.integrity,
        expired: signaturesMeta.expired,
        meta: {
          certs: signaturesMeta.certs,
        },
        pages: pdfMeta.pages,
        fingerpring: pdfMeta.fingerprint,
        creation_data: pdfMeta.info.CreationDate,
        creator: pdfMeta.info.Creator,
        author: pdfMeta.info.Author,
        title: pdfMeta.info.Title,
        description: pdfMeta.info.Keywords,
        mod_date: pdfMeta.info.ModDate,
      };
    } catch (error) {
      console.error(error);
      throw new Error("Could not get pdf metadata");
    }
  };

  insertQrCode = async (imgBytes: ArrayBuffer): Promise<ArrayBuffer> => {
    const pdfDoc = await PDFDocument.load(this.document);
    const img = await pdfDoc.embedPng(imgBytes);
    const imagePage = pdfDoc.insertPage(0);

    imagePage.drawImage(img, {
      x: 0,
      y: 0,
      width: imagePage.getWidth(),
      height: imagePage.getHeight(),
    });

    const pdfBytes = await pdfDoc.save();

    return pdfBytes;
  };
}

export default PDFparser;