/**
 * Message types for the smartsocket protocol
 */
export type TMessageType =
  | 'authRequest'      // Server requests authentication from client
  | 'auth'             // Client provides authentication data
  | 'authResponse'     // Server responds to authentication
  | 'serverReady'      // Server signals it's fully ready
  | 'function'         // Function call request
  | 'functionResponse' // Function call response
  | 'tagUpdate';       // Tag store synchronization

/**
 * Base message interface for all smartsocket messages
 */
export interface ISocketMessage<T = unknown> {
  type: TMessageType;
  id?: string;         // For request/response correlation
  payload: T;
}

/**
 * Authentication request payload (server -> client)
 */
export interface IAuthRequestPayload {
  serverAlias: string;
}

/**
 * Authentication data payload (client -> server)
 */
export interface IAuthPayload {
  alias: string;
}

/**
 * Authentication response payload (server -> client)
 */
export interface IAuthResponsePayload {
  success: boolean;
  error?: string;
}

/**
 * Function call payload
 */
export interface IFunctionCallPayload<T = unknown> {
  funcName: string;
  funcData: T;
}

/**
 * Tag update payload
 */
export interface ITagUpdatePayload {
  tags: Record<string, unknown>;
}

/**
 * Helper type for creating typed messages
 */
export type TAuthRequestMessage = ISocketMessage<IAuthRequestPayload>;
export type TAuthMessage = ISocketMessage<IAuthPayload>;
export type TAuthResponseMessage = ISocketMessage<IAuthResponsePayload>;
export type TFunctionMessage = ISocketMessage<IFunctionCallPayload>;
export type TFunctionResponseMessage = ISocketMessage<IFunctionCallPayload>;
export type TTagUpdateMessage = ISocketMessage<ITagUpdatePayload>;
