import type { Wallet } from "@saberhq/solana-contrib";
import type {
  AccountMeta,
  Connection,
  PublicKey,
  Transaction,
} from "@solana/web3.js";

import { withFindOrInitAssociatedTokenAccount } from "../../utils";
import { getMetadataId } from "./pda";

export const withRemainingAccountsForMint = async (
  transaction: Transaction,
  connection: Connection,
  wallet: Wallet,
  params: {
    mints: PublicKey[];
  }
) => {
  const res = await Promise.all(
    params.mints.map(async (mintId) => {
      const [mintTokenAccount, mintMetadataId] = await Promise.all([
        withFindOrInitAssociatedTokenAccount(
          transaction,
          connection,
          mintId,
          wallet.publicKey,
          wallet.publicKey
        ),
        getMetadataId(mintId),
      ]);
      return [
        {
          pubkey: mintId,
          isSigner: false,
          isWritable: false,
        },
        {
          pubkey: mintMetadataId,
          isSigner: false,
          isWritable: false,
        },
        {
          pubkey: mintTokenAccount,
          isSigner: false,
          isWritable: false,
        },
      ];
    })
  );

  const remainingAccounts: AccountMeta[] = res.flat();

  return remainingAccounts;
};
