import { IInitData, AccountInfo, NetworkInfo, ChainData, EndlessSignMessageInput, UserResponse, EndlessSignMessageOutput } from '../types.mjs';
import { TronWebOptions } from 'tronWeb/lib/esm/types';
import '../utils/index.mjs';
import 'tronWeb';

interface IMetaData {
    gameId: string;
    userId: string;
    walletAddress: string;
}
interface IMessageData {
    uuid: string;
    methodName: string;
    from?: string | null;
    metadata: IMetaData;
    initData?: IInitData;
    data: unknown;
}
interface IResponseMessageData {
    uuid: string;
    status: string;
    data: any;
    methodName: string;
    errMsg?: string;
}
interface IRequestData {
    method: MethodName;
    data?: unknown;
    initData?: IInitData;
}
declare enum EndLessSDKEvent {
    CONNECT = "connect",
    GETACCOUNT = "getAccount",
    DISCONNECT = "disconnect",
    ACCOUNT_CHANGE = "accountChange",
    NETWORK_CHANGE = "luffa_switchChain",
    CHAIN_CHANGED = "chainChanged"
}
type EndLessSDKEventType = (typeof EndLessSDKEvent)[keyof typeof EndLessSDKEvent];
interface EndLessSDKEventsMap {
    [EndLessSDKEvent.CONNECT]: AccountInfo;
    [EndLessSDKEvent.DISCONNECT]: void;
    [EndLessSDKEvent.ACCOUNT_CHANGE]: AccountInfo;
    [EndLessSDKEvent.GETACCOUNT]: AccountInfo[];
    [EndLessSDKEvent.GETACCOUNT]: AccountInfo[];
    [EndLessSDKEvent.NETWORK_CHANGE]: NetworkInfo;
    [EndLessSDKEvent.CHAIN_CHANGED]: string;
}
type EndLessSDKEventPayload<T extends EndLessSDKEventType> = T extends keyof EndLessSDKEventsMap ? EndLessSDKEventsMap[T] : undefined;
type EndLessSDKEventListenersType = {
    [K in EndLessSDKEventType]?: Array<(payload: EndLessSDKEventPayload<K>) => void>;
};

interface Metadata {
    title: string;
    url: string;
    origin: string;
    icon: string;
    gameId: string;
    userId: string;
    walletAddress: string;
}
interface TronRequestParams {
    method: 'eth_requestAccounts' | string;
    params?: any;
}

declare enum MethodName {
    CONNECT = "connect",
    GETACCOUNT = "getAccount",
    DISCONNECT = "disconnect",
    NETWORK_CHANGE = "luffa_switchChain",
    SIGN_MESSAGE = "signMessage",
    SEND_TRANSACTION = "sendTransaction",
    SIGN_AND_SUBMIT_TRANSACTION = "signAndSubmitTransaction",
    SIGN_TRANSACTION = "signTransaction",
    SIGN_BUILD_TRANSACTION = "signBuildTransaction",
    EVM_APPROVE = "evmApprove",
    ACCOUNT_CHANGE = "accountChange"
}
declare class LuffaTronSdk {
    static readonly version: string;
    private static _instance;
    private message;
    private _metadata;
    private _initData;
    private accountAddress;
    private _wallet;
    static getIninData: () => IInitData;
    static getAccountAddress: () => string | null;
    static setAccountAddress: (accountAddress: string | null) => void;
    constructor(initData: TronWebOptions & {
        network: string;
    });
    private initConfig;
    sendTransaction(params: any): Promise<any>;
    changeNetwork(chainData: ChainData): void;
    private getMetadata;
    request: (data: IRequestData, callback?: (data: unknown) => void) => void;
    getAccount: () => Promise<string[]>;
    connect: () => Promise<[string]>;
    disconnect: (callback?: (data: unknown) => void) => Promise<void>;
    signMessage: (data: EndlessSignMessageInput, callback?: (data: unknown) => void) => Promise<UserResponse<EndlessSignMessageOutput>>;
    on: <K extends EndLessSDKEventType>(methodName: K, callback: (payload: EndLessSDKEventPayload<K>) => void) => void;
    off: <K extends EndLessSDKEventType>(methodName: K, callback?: (payload: EndLessSDKEventPayload<K>) => void) => void;
    signAndSubmitTransaction: (params: any) => Promise<any>;
    signTransaction: (params: any, methodName?: MethodName) => Promise<any>;
    onAccountChange: (callback: (data: AccountInfo) => void) => void;
    onNetworkChange: (callback: (data: NetworkInfo) => void) => void;
}

export { EndLessSDKEvent, type EndLessSDKEventListenersType, type EndLessSDKEventPayload, type EndLessSDKEventType, type EndLessSDKEventsMap, type IMessageData, type IMetaData, type IRequestData, type IResponseMessageData, LuffaTronSdk as L, type Metadata as M, type TronRequestParams as T, MethodName as a };
