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

// Local imports
import { BasketsProgram } from "../../idl/types";
import { fetchBasketState } from "../../state/basket";
import { getBasketPda, getDeactivatedLookupTableAccount, getLookupTableAccount, getStateCreatorAccount } from "../../utils/programAccounts";


export async function createLookupTableIx(params: {
    program: Program<BasketsProgram>;
    manager: PublicKey;
    basket: PublicKey;
}): Promise<TransactionInstruction> {
    const { program, manager } = params;
    const basketState = await fetchBasketState(program, params.basket);
    const slot = await program.provider.connection.getSlot();
    const basketPda = getBasketPda(params.basket);
    const oldLookupTable1 = basketState.otherLookupTable1;
    const oldLookupTable2 = basketState.otherLookupTable2;
    const newLookupTable1 = getLookupTableAccount(basketPda, slot);
    const newLookupTable2 = getLookupTableAccount(basketPda, slot - 1);
    const deactivatedLookupTable1 = getDeactivatedLookupTableAccount(oldLookupTable1);
    const deactivatedLookupTable2 = getDeactivatedLookupTableAccount(oldLookupTable2);
    const stateCreator = getStateCreatorAccount();
    const ix = await program.methods
        .createLookupTable(
            slot
        )
        .accountsStrict({
            manager,
            basket: params.basket,
            basketPda,
            oldLookupTable1,
            oldLookupTable2,
            newLookupTable1,
            newLookupTable2,
            deactivatedLookupTable1,
            deactivatedLookupTable2,
            stateCreator,
            addressLookupTableProgram: AddressLookupTableProgram.programId,
            systemProgram: SystemProgram.programId,
        })
        .instruction();

    return ix;
}
