import fs from "fs";
import path from "path";
import { describe, it, expect, beforeAll } from "@jest/globals";
import PDFparser from "../src/pdfParser";
import { AppError } from "../src/lib/errors";
import { saveAs } from "file-saver";

describe("PDF parser", () => {
  it("should return pdf document metadata including signatures", async () => {
    const file = fs.readFileSync(
      path.resolve(__dirname, "./abacus-two-signatures.pdf")
    );

    const parser = new PDFparser(file);
    const actual = await parser.getPDFMeta();

    expect(actual.pages).toEqual(2);
  });

  it("should return pdf document metadata without signatures", async () => {
    const file = fs.readFileSync(path.resolve(__dirname, "./example.pdf"));

    const parser = new PDFparser(file);

    const actual = await parser.getPDFMeta();
    expect(actual.pages).toEqual(1);
    expect(actual.title).toEqual("PDF Digital Signatures");
    expect(actual.author).toEqual("Tecxoft");
  });

  it("should throw error without file", async () => {
    try {
      const parser = new PDFparser(null);
      const actual = await parser.getPDFMeta();
    } catch (error) {
      expect(error).toBeInstanceOf(AppError);
    }
  });

  it("should throw error if file type is different then pdf", async () => {
    const file = fs.readFileSync(path.resolve(__dirname, "./test.txt"));

    try {
      const parser = new PDFparser(file);
      const actual = await parser.getPDFMeta();
    } catch (error) {
      expect(error).toBeInstanceOf(AppError);
      expect(error.message).toEqual("Only pdf file type is supported");
    }
  });
});

type SealCoords = {
  [key: string]: { x: string; y: string };
};

describe("PDF insert", () => {
  it.only("should insert qrcode into the pdf without breaking the signature", async () => {
    // Signed-linux-libreOfficeWriterTest-v1.6-signed-pades-baseline-b
    // Signed-linux-OpenOfficeWriter-v1.4-signed-pades-baseline-b
    // Signed-mac-Adobe-1.3-signed-pades-baseline-b
    // Signed-XXX-nopodofo-test-v.1.7-signed-pades-baseline-b
    const filename = "abacus-two-signatures";
    const file = fs.readFileSync(
      path.resolve(__dirname, `./source/${filename}.pdf`)
    );

    const qrcode = fs.readFileSync(path.resolve(__dirname, "./qrcode.png"));

    const parser = new PDFparser(file);

    const sealCoords: SealCoords = {
      "1": { x: "261.6", y: "384.84" },
      "2": { x: "261.6", y: "384.84" },
    };

    const resultPDF = await parser.insertQrCode(
      qrcode.buffer,
      "vereign.com",
      sealCoords,
      0.25,
      "demo:1652778685773:7b893c000300000000b9c455b21b7b47780dc82f9ef63ddc54ce5c282b"
    );

    fs.writeFileSync(
      `${__dirname}/outputs/tron/${filename}-im11age.pdf`,
      Buffer.from(resultPDF)
    );

    expect(true).toBeTruthy();
  }, 30000);
});