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: any
}

export interface IResponseMessageData {
  uuid: string,
  status: string,
  data: any,
  methodName: string,
  errMsg?: string
}

export interface IRequestData {
  method: MethodName | string,
  data?: unknown,
  initData?: IInitData,
}

export enum EndLessSDKEvent {
	CONNECT = 'connect',
	GETACCOUNT = 'getAccount',
	DISCONNECT = 'disconnect',
	ACCOUNT_CHANGE = 'accountChange',
	NETWORK_CHANGE ='networkChange',
};
export type EndLessSDKEventType = (typeof EndLessSDKEvent)[keyof typeof EndLessSDKEvent];
export interface EndLessSDKEventsMap {
	[EndLessSDKEvent.CONNECT]: AccountInfo;
	[EndLessSDKEvent.DISCONNECT]: void;
	[EndLessSDKEvent.ACCOUNT_CHANGE]: AccountInfo;
	[EndLessSDKEvent.GETACCOUNT]: AccountInfo[];
	[EndLessSDKEvent.GETACCOUNT]: AccountInfo[];
	[EndLessSDKEvent.NETWORK_CHANGE]: NetworkInfo;
}
export type EndLessSDKEventPayload<T extends EndLessSDKEventType> = T extends keyof EndLessSDKEventsMap ? EndLessSDKEventsMap[T] : undefined;

export type EndLessSDKEventListenersType = {
	[K in EndLessSDKEventType]?: Array<(payload: EndLessSDKEventPayload<K>) => void>;
};
