/**
 * This file contains code adapted from the Jupiter Protocol's instruction parser
 * Source: https://github.com/jup-ag/instruction-parser
 * Modified for use in XSwap
 */
import { Event, Program, utils } from "@coral-xyz/anchor";
import { JUPITER_V6_PROGRAM_ID } from "@src/constants";
import { Jupiter } from "@src/contracts/idl/jupiter";
import { TransactionWithMeta } from "@src/models/SolanaTransaction";

export function getEvents(
  program: Program<Jupiter>,
  transactionResponse: TransactionWithMeta,
) {
  const events: Event[] = [];

  if (transactionResponse && transactionResponse.meta) {
    const { meta } = transactionResponse;

    meta.innerInstructions?.map(async (ix) => {
      ix.instructions.map(async (iix) => {
        if (!iix.programId.equals(JUPITER_V6_PROGRAM_ID)) return;
        if (!("data" in iix)) return; // Guard in case it is a parsed decoded instruction

        const ixData = utils.bytes.bs58.decode(iix.data);
        const eventData = utils.bytes.base64.encode(ixData.subarray(8));
        const event = program.coder.events.decode(eventData);

        if (!event) return;

        events.push(event);
      });
    });
  }

  return events;
}
