import { PublicKey } from "@solana/web3.js";
import { DexClient } from "../core/client";
import { ETFNotExistsError } from "./error";
import { ETFCreateParams } from "../types/params";
import { getAccount } from "@solana/spl-token";
import { deriveEtfTokenMintAccount } from "./getAddress";
import * as anchor from "@coral-xyz/anchor";
import { getAssociatedTokenAddressSync, Account } from "@solana/spl-token";
import { checkATAExists } from "./checks";
export interface ETFInfo {
    etfCoreAddress: PublicKey;
    creator: string;
    description: string;
    assets: Array<{
        token: PublicKey;
        weight: number;
    }>;
}

export class ETFQueries {
    constructor(private client: DexClient) { }


    async getETFInfo(etfAddress: PublicKey): Promise<ETFInfo | string> {
        const [etfInfoAddress] = deriveEtfTokenMintAccount(this.client.program as unknown as anchor.Program, ["etf_token_v3", etfAddress]);
        try {

            const etfInfo = await this.client.program.account.etfToken.fetch(etfInfoAddress);

            return {
                etfCoreAddress: etfInfoAddress,
                creator: etfInfo.creator.toString(),
                description: etfInfo.description,
                assets: etfInfo.assets.map(item => ({
                    token: item.token,
                    weight: item.weight
                }))
            };
        } catch (error) {
            if (error instanceof Error && error.message.includes('Account does not exist')) {
                return `ETF不存在: ${etfAddress}`;
            }
            throw error;
        }
    }

    async getETFBalance(etfAddress: PublicKey, ownerAddress: PublicKey): Promise<number> {
        try {
            const tokenAccount = await checkATAExists(this.client, [etfAddress], ownerAddress);
            return Number(tokenAccount?.amount);
        } catch (error) {
            if (error instanceof Error && error.message.includes('Account does not exist')) {
                return 0;
            }
            throw error;
        }
    }
} 