import { User } from './user.model';

export enum MessageType {
  CHAT = 'CHAT',
  PING = 'PING',
  NAME_CHANGE = 'NAME_CHANGE',
  COLOR_CHANGE = 'COLOR_CHANGE',
  PONG = 'PONG',
  SYSTEM = 'SYSTEM',
  USER_JOINED = 'USER_JOINED',
  CHAT_ACTION = 'CHAT_ACTION',
  FEDIVERSE_ENGAGEMENT_FOLLOW = 'FEDIVERSE_ENGAGEMENT_FOLLOW',
  FEDIVERSE_ENGAGEMENT_LIKE = 'FEDIVERSE_ENGAGEMENT_LIKE',
  FEDIVERSE_ENGAGEMENT_REPOST = 'FEDIVERSE_ENGAGEMENT_REPOST',
  CONNECTED_USER_INFO = 'CONNECTED_USER_INFO',
  ERROR_USER_DISABLED = 'ERROR_USER_DISABLED',
  ERROR_NEEDS_REGISTRATION = 'ERROR_NEEDS_REGISTRATION',
  ERROR_MAX_CONNECTIONS_EXCEEDED = 'ERROR_MAX_CONNECTIONS_EXCEEDED',
  VISIBILITY_UPDATE = 'VISIBILITY-UPDATE',
}

export interface SocketEvent {
  id: string;
  timestamp: Date;
  type: MessageType;
}

export interface ConnectedClientInfoEvent extends SocketEvent {
  user: User;
}
export class ChatEvent implements SocketEvent {
  constructor(message) {
    this.id = message.id;
    this.timestamp = message.timestamp;
    this.type = message.type;
    this.body = message.body;
    if (message.user) {
      this.user = new User(message.user);
    }
  }

  timestamp: Date;

  type: MessageType;

  id: string;

  user: User;

  body: string;
}

export interface NameChangeEvent extends SocketEvent {
  user: User;
  oldName: string;
}

export interface MessageVisibilityEvent extends SocketEvent {
  visible: boolean;
  ids: string[];
}

export interface FediverseEvent extends SocketEvent {
  title: string;
  image: string;
  link: string;
  body: string;
}