/**
 * This examples shows how you can create a PKPass from scratch,
 * by adding files later and not adding pass.json
 */

import { promises as fs } from "node:fs";
import path from "node:path";
import { PKPass } from "passkit-generator";
import { getCertificates } from "./getCertificates";

export interface PassProps {
  member: {
    name: string;
    accountNumber: string;
    contactNumber: string;
    validTill: string;
  };
}
const __dirname = process.cwd();
export async function generatePass(passProps: PassProps) {
  const [iconFromModel, thumbnailModel, logoModel, certificates] =
    await Promise.all([
      fs.readFile(path.resolve(__dirname, "assets/pass-icon.png")),
      fs.readFile(path.resolve(__dirname, "assets/pass-thumbnail.png")),
      fs.readFile(path.resolve(__dirname, "assets/pass-logo.png")),
      await getCertificates(),
    ]);

  try {
    const pass = new PKPass(
      {},
      {
        wwdr: certificates.wwdr,
        signerCert: certificates.signerCert,
        signerKey: certificates.signerKey,
        signerKeyPassphrase: certificates.signerKeyPassphrase,
      },
      {
        formatVersion: 1,
        passTypeIdentifier: "pass.com.karmagroup.wallet",
        serialNumber: "45563224",
        teamIdentifier: "G7GHTAP5XU",
        organizationName: "Karma Group",
        description: "Karma Group Apple Wallet Pass",
        foregroundColor: `rgb(255,255,255)`,
        labelColor: `rgb(191,162,83)`,
        backgroundColor: `rgb(0,18,26)`,
      },
    );

    pass.type = "generic";
    pass.primaryFields.push({
      key: "membershipNumber",
      label: "MEMBERSHIP NUMBER",
      value: passProps.member.accountNumber,
    });
    pass.secondaryFields.push({
      key: "memberName",
      label: "MEMBER NAME",
      value: passProps.member.name,
    });
    pass.auxiliaryFields.push({
      key: "memberNumber",
      label: "MEMBER NUMBER",
      value: passProps.member.contactNumber,
    });
    pass.auxiliaryFields.push({
      key: "validity",
      label: "VALID TILL",
      value: passProps.member.validTill,
    });
    pass.setBarcodes(
      {
        message: "Thank you for using this package <3",
        format: "PKBarcodeFormatCode128",
      },
      {
        message: "Thank you for using this package <3",
        format: "PKBarcodeFormatPDF417",
      },
    );

    /**
     * Required by Apple. If one is not available, a
     * pass might be openable on a Mac but not on a
     * specific iPhone model
     */

    pass.addBuffer("icon.png", iconFromModel);
    pass.addBuffer("icon@2x.png", iconFromModel);
    pass.addBuffer("icon@3x.png", iconFromModel);

    pass.addBuffer("thumbnailImage.png", thumbnailModel);
    pass.addBuffer("thumbnailImage@2x.png", thumbnailModel);
    pass.addBuffer("thumbnailImage@3x.png", thumbnailModel);

    pass.addBuffer("logo.png", logoModel);
    pass.addBuffer("logo@2x.png", logoModel);
    pass.addBuffer("logo@3x.png", logoModel);

    const buffer = pass.getAsBuffer();
    // await fs.writeFile("KarmaGroupMembershipCard.pkpass", buffer)
    return {
      buffer,
      mimeType: pass.mimeType,
    };
  } catch (err) {
    console.log(err);
  }
}

export async function generateHOKPass(passProps: PassProps) {
  const [iconFromModel, thumbnailModel, logoModel, certificates] =
    await Promise.all([
      fs.readFile(path.resolve(__dirname, "assets/pass-hok-icon.png")),
      fs.readFile(path.resolve(__dirname, "assets/pass-hok-thumbnail.png")),
      fs.readFile(path.resolve(__dirname, "assets/pass-hok-logo.png")),
      await getCertificates(),
    ]);

  try {
    const pass = new PKPass(
      {},
      {
        wwdr: certificates.wwdr,
        signerCert: certificates.signerCert,
        signerKey: certificates.signerKey,
        signerKeyPassphrase: certificates.signerKeyPassphrase,
      },
      {
        formatVersion: 1,
        passTypeIdentifier: "pass.com.karmagroup.wallet",
        serialNumber: "45563224",
        teamIdentifier: "G7GHTAP5XU",
        organizationName: "Karma Group",
        description: "Karma Group Apple Wallet Pass",
        foregroundColor: `rgb(255,255,255)`,
        labelColor: `rgb(255,213,189)`,
        backgroundColor: `rgb(0,18,26)`,
      },
    );

    pass.type = "generic";
    pass.primaryFields.push({
      key: "membershipNumber",
      label: "MEMBERSHIP NUMBER",
      value: passProps.member.accountNumber,
    });
    pass.secondaryFields.push({
      key: "memberName",
      label: "MEMBER NAME",
      value: passProps.member.name,
    });
    pass.auxiliaryFields.push({
      key: "memberNumber",
      label: "MEMBER NUMBER",
      value: passProps.member.contactNumber,
    });
    pass.auxiliaryFields.push({
      key: "validity",
      label: "VALID TILL",
      value: passProps.member.validTill,
    });
    pass.setBarcodes(
      {
        message: "Thank you for using this package <3",
        format: "PKBarcodeFormatCode128",
      },
      {
        message: "Thank you for using this package <3",
        format: "PKBarcodeFormatPDF417",
      },
    );

    /**
     * Required by Apple. If one is not available, a
     * pass might be openable on a Mac but not on a
     * specific iPhone model
     */

    // Icon images
    pass.addBuffer("icon.png", iconFromModel);
    pass.addBuffer("icon@2x.png", iconFromModel);
    pass.addBuffer("icon@3x.png", iconFromModel);

    // Thumbnail images
    pass.addBuffer("thumbnailImage.png", thumbnailModel);
    pass.addBuffer("thumbnailImage@2x.png", thumbnailModel);
    pass.addBuffer("thumbnailImage@3x.png", thumbnailModel);

    // Logo images
    pass.addBuffer("logo.png", logoModel);
    pass.addBuffer("logo@2x.png", logoModel);
    pass.addBuffer("logo@3x.png", logoModel);

    const buffer = pass.getAsBuffer();
    // await fs.writeFile("KarmaGroupMembershipCard.pkpass", buffer)
    return {
      buffer,
      mimeType: pass.mimeType,
    };
  } catch (err) {
    console.log(err);
  }
}
