import { MethodName } from '../index';
import type { AccountInfo, NetworkInfo, IInitData } from '../types';
export interface IMetaData {
  gameId: string;
  userId: string;
  walletAddress: string;
}

export interface IMessageData {
  uuid: string,
  methodName: string,
  from?: string | null,
  metadata: IMetaData,
  initData?: IInitData,
  data: unknown
}

export interface IResponseMessageData {
  uuid: string,
  status: string,
  data: any,
  methodName: string,
  errMsg?: string
}

export interface IRequestData {
  method: MethodName,
  data?: unknown,
  initData?: IInitData,
}

export enum TronSDKEvent {
	CONNECT = 'connect',
	GETACCOUNT = 'getAccount',
	DISCONNECT = 'disconnect',
	ACCOUNT_CHANGE = 'accountChange',
	NETWORK_CHANGE ='luffa_switchChain',
	CHAIN_CHANGED ='chainChanged',
};
export type TronSDKEventType = (typeof TronSDKEvent)[keyof typeof TronSDKEvent];
export interface TronSDKEventsMap {
	[TronSDKEvent.CONNECT]: AccountInfo;
	[TronSDKEvent.DISCONNECT]: void;
	[TronSDKEvent.ACCOUNT_CHANGE]: AccountInfo;
	[TronSDKEvent.GETACCOUNT]: AccountInfo[];
	[TronSDKEvent.NETWORK_CHANGE]: NetworkInfo;
	[TronSDKEvent.CHAIN_CHANGED]: string;
}
export type TronSDKEventPayload<T extends TronSDKEventType> = T extends keyof TronSDKEventsMap ? TronSDKEventsMap[T] : undefined;

export type TronSDKEventListenersType = {
	[K in TronSDKEventType]?: Array<(payload: TronSDKEventPayload<K>) => void>;
};
