// Core dependencies
import { BN, Program } from "@coral-xyz/anchor";
import { PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js";

// Local imports
import { AgentsProgram } from "../idl/types";
import { getAta, getEventAuthority, getFeesVault } from "../utils/programAccounts";
import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token";


export async function topUpBalanceIx(params: {
    payer: PublicKey,
    program: Program<AgentsProgram>,
    amount: number,
    mint: PublicKey,
}): Promise<TransactionInstruction> {
    const { program, amount, mint, payer } = params;

    let userDepositTokenAccount = getAta(payer, mint);
    let feesVault = getFeesVault(program);
    let vaultDepositTokenAccount = getAta(feesVault, mint);
    let eventAuthority = getEventAuthority(program);
    
    const ix = program.methods.topUpBalance(new BN(amount))
        .accountsStrict({
            user: payer,
            depositTokenMint: mint,
            userDepositTokenAccount,
            feesVault,
            vaultDepositTokenAccount,
            tokenProgram: TOKEN_PROGRAM_ID,
            associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,
            systemProgram: SystemProgram.programId,
            program: program.programId,
            eventAuthority,
        })
        .instruction();

    return ix;
}
