import { PublicKey } from "@solana/web3.js";
import { BN, Program } from "@coral-xyz/anchor";
import { AgentsProgram } from "../idl/types";
import { stringify } from "uuid";
export const AGENTS_STATE_SIZE = 1216;

export interface AgentState {
    ownAddress: PublicKey,
    uuid: number[],
    creator: PublicKey,

    hasToken: number,
    metadata: PublicKey,
    mint: PublicKey,

    agentPda: PublicKey,
    balance: BN,
    usdcBalance: BN,
    wsolBalance: BN,

    authority: PublicKey,

    extraBytes: PublicKey[],
}

export interface ParsedAgentState {
    agent: string,
    state: string,
    uuid: string,
    creator: string,
    hasToken: number,
    metadata: string,
    mint: string,
    balance: number,
    usdcBalance: number,
    wsolBalance: number,
    authority: string,
}

export async function fetchAgentState(
    program: Program<AgentsProgram>,
    agent: PublicKey
): Promise<AgentState> {
    return await program.account.agent.fetch(agent);
}

export function parseAgentState(
    agentState: AgentState
): ParsedAgentState {
    return {
        agent: agentState.agentPda.toBase58(),
        state: agentState.ownAddress.toBase58(),
        uuid: stringify(Uint8Array.from(agentState.uuid)),
        creator: agentState.creator.toBase58(),
        hasToken: agentState.hasToken,
        metadata: agentState.metadata.toBase58(),
        mint: agentState.mint.toBase58(),
        balance: parseInt(agentState.balance.toString()),
        usdcBalance: parseInt(agentState.usdcBalance.toString()),
        wsolBalance: parseInt(agentState.wsolBalance.toString()),
        authority: agentState.authority.toBase58(),
    };
}
