import { EntityJson, Options } from '@nymphjs/nymph';

export type QuerySubscriptionData = {
  current: string[];
  query: string;
  qrefParents: {
    etype: string;
    query: string;
  }[];
  /**
   * This means the user directly subscribed to this query, as opposed
   * to indirectly subscribing with a qref clause.
   */
  direct: boolean;
  count: boolean;
};

export type AuthenticateMessageData = {
  action: 'authenticate';
  authToken: string;
  switchToken?: string;
};

export type QuerySubscribeMessageData = {
  action: 'subscribe' | 'unsubscribe';
  query: string;
  count?: boolean;
};

export type UidSubscribeMessageData = {
  action: 'subscribe' | 'unsubscribe';
  uid: string;
  count?: boolean;
};

export type SubscribeMessageData =
  | QuerySubscribeMessageData
  | UidSubscribeMessageData;

export type PublishEntityMessageData = {
  action: 'publish';
  guid: string;
  event: 'create' | 'update' | 'delete';
  etype: string;
  entity?: EntityJson;
};

export type PublishUidMessageData = {
  action: 'publish';
  event: 'newUID' | 'setUID' | 'renameUID' | 'deleteUID';
  name?: string;
  oldName?: string;
  newName?: string;
  value?: number;
};

export type PublishMessageData =
  | PublishEntityMessageData
  | PublishUidMessageData;

export type MessageData =
  | AuthenticateMessageData
  | SubscribeMessageData
  | PublishMessageData;

export type MessageOptions = Options & {
  class: string;
};
