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: any
}

export interface IResponseMessageData {
  uuid: string,
  status: string,
  data: any,
  methodName: string,
  errMsg?: string
}

export interface IRequestData {
  initData?: IInitData,
  method: string;
  params: any;
}

export enum EvmSDKEvent {
	CONNECT = 'connect',
	GETACCOUNT = 'getAccount',
	DISCONNECT = 'disconnect',
	ACCOUNT_CHANGE = 'accountChange',
	ACCOUNTS_CHANGE = 'accountsChanged',
	NETWORK_CHANGE ='luffa_switchChain',
	CHAIN_CHANGED ='chainChanged',
};
export type EvmSDKEventType = (typeof EvmSDKEvent)[keyof typeof EvmSDKEvent];
export interface EvmSDKEventsMap {
	[EvmSDKEvent.CONNECT]: string[];
	[EvmSDKEvent.DISCONNECT]: void;
	[EvmSDKEvent.ACCOUNT_CHANGE]: AccountInfo;
	[EvmSDKEvent.ACCOUNTS_CHANGE]: string[];
	[EvmSDKEvent.GETACCOUNT]: AccountInfo[];
	[EvmSDKEvent.NETWORK_CHANGE]: NetworkInfo;
	[EvmSDKEvent.CHAIN_CHANGED]: string;
}
export type EvmSDKEventPayload<T extends EvmSDKEventType> = T extends keyof EvmSDKEventsMap ? EvmSDKEventsMap[T] : undefined;

export type EvmSDKEventListenersType = {
	[K in EvmSDKEventType]?: Array<(payload: EvmSDKEventPayload<K>) => void>;
};
