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

// Local imports
import { BasketsProgram } from "../../idl/types";
import { getAta, getRebalanceStateAccount } from "../../utils/programAccounts";
import { BasketState } from "../../state/basket";
import { REBALANCE_FEE_WALLET } from "../../utils/constants";

export async function depositAfterRebalanceIx( params: {
    program: Program<BasketsProgram>,
    basketState: BasketState,
    payer: PublicKey,
    fromTokenMint: PublicKey,
    toTokenMint: PublicKey,
    checkWeights: boolean,
}): Promise<TransactionInstruction> {
    const { program, basketState } = params;
    const basketPda = basketState.basketPda;
    const basketFromTokenAccount = getAta(basketPda, params.fromTokenMint);
    const workerFromTokenAccount = getAta(params.payer, params.fromTokenMint);
    const basketToTokenAccount = getAta(basketPda, params.toTokenMint);
    const workerToTokenAccount = getAta(params.payer, params.toTokenMint);
    const rebalanceState = getRebalanceStateAccount();
    const rebalanceFeeAccount = getAta(REBALANCE_FEE_WALLET, params.toTokenMint);
    const ix = await program.methods
        .basketDepositAfterRebalance(
            params.checkWeights == true ? 1 : 0,
        ).accountsStrict({
            worker: params.payer,
            basket: basketState.ownAddress,
            basketPda,
            fromTokenMint: params.fromTokenMint,
            basketFromTokenAccount,
            workerFromTokenAccount,
            toTokenMint: params.toTokenMint,
            basketToTokenAccount,
            workerToTokenAccount,
            rebalanceState,
            rebalanceFeeAccount,
            instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,
            systemProgram: SystemProgram.programId,
            tokenProgram: TOKEN_PROGRAM_ID,
        }).instruction();
    return ix;
}
