import { CometChat } from "@cometchat/chat-sdk-react-native";
import {
  CometChatConversationEvents,
  CometChatGroupsEvents,
  CometChatUIEvents,
  MessageEvents,
} from "../events";
import { CometChatUIEventHandler } from "../events/CometChatUIEventHandler/CometChatUIEventHandler";

export class CometChatUIKitHelper {
  //---------- Message Events ----------
  static onMessageSent(message: CometChat.BaseMessage, status: string): void {
    CometChatUIEventHandler.emitMessageEvent(MessageEvents.ccMessageSent, { message, status });
  }

  static onMessageEdited(message: CometChat.BaseMessage, status: string): void {
    CometChatUIEventHandler.emitMessageEvent(MessageEvents.ccMessageEdited, { message, status });
  }

  static onMessageDeleted(message: CometChat.BaseMessage): void {
    CometChatUIEventHandler.emitMessageEvent(MessageEvents.ccMessageDeleted, { message });
  }

  static onMessageRead(message: CometChat.BaseMessage): void {
    CometChatUIEventHandler.emitMessageEvent(MessageEvents.ccMessageRead, { message });
  }

  //---------- User Events ----------
  static onUserBlocked(user: CometChat.User): void {
    CometChatUIEventHandler.emitUserEvent(CometChatUIEvents.ccUserBlocked, { user });
  }

  static onUserUnblocked(user: CometChat.User): void {
    CometChatUIEventHandler.emitUserEvent(CometChatUIEvents.ccUserUnBlocked, { user });
  }

  //---------- Group Events ----------
  static onGroupCreated(group: CometChat.Group): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatGroupsEvents.ccGroupCreated, { group });
  }

  static onGroupDeleted(group: CometChat.Group): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatGroupsEvents.ccGroupDeleted, { group });
  }

  static onGroupLeft(
    message: CometChat.Action,
    leftUser: CometChat.User,
    leftGroup: CometChat.Group
  ): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatUIEvents.ccGroupLeft, {
      message,
      leftUser,
      leftGroup,
    });
  }

  static onGroupMemberScopeChanged(
    message: CometChat.Action,
    updatedUser: CometChat.User,
    scopeChangedTo: string,
    scopeChangedFrom: string,
    group: CometChat.Group
  ): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatGroupsEvents.ccGroupMemberScopeChanged, {
      message,
      updatedUser,
      scopeChangedTo,
      scopeChangedFrom,
      group,
    });
  }

  static onGroupMemberBanned(
    message: CometChat.Action,
    bannedUser: CometChat.User,
    bannedBy: CometChat.User,
    bannedFrom: CometChat.Group
  ): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatGroupsEvents.ccGroupMemberBanned, {
      message,
      bannedUser,
      bannedBy,
      group: bannedFrom,
    });
  }

  static onGroupMemberKicked(
    message: CometChat.Action,
    kickedUser: CometChat.User,
    kickedBy: CometChat.User,
    kickedFrom: CometChat.Group
  ): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatGroupsEvents.ccGroupMemberKicked, {
      message,
      kickedUser,
      kickedBy,
      group: kickedFrom,
    });
  }

  static onGroupMemberUnbanned(
    message: CometChat.Action,
    unbannedUser: CometChat.User,
    unbannedBy: CometChat.User,
    unbannedFrom: CometChat.Group
  ): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatUIEvents.ccGroupMemberUnBanned, {
      message,
      unbannedUser,
      unbannedBy,
      unbannedFrom,
    });
  }

  static onGroupMemberJoined(joinedUser: CometChat.User, joinedGroup: CometChat.Group): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatUIEvents.ccGroupMemberJoined, {
      joinedUser,
      joinedGroup,
    });
  }

  static onGroupMemberAdded(
    messages: CometChat.Action[],
    usersAdded: CometChat.User[],
    groupAddedIn: CometChat.Group,
    addedBy: CometChat.User
  ): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatUIEvents.ccGroupMemberAdded, {
      messages,
      usersAdded,
      usersAddedIn: groupAddedIn,
      addedBy,
    });
  }

  static onOwnershipChanged(group: CometChat.Group, newOwner: CometChat.GroupMember): void {
    CometChatUIEventHandler.emitGroupEvent(CometChatUIEvents.ccOwnershipChanged, {
      group,
      newOwner,
    });
  }

  //---------- Conversation Events ----------
  static onConversationDeleted(conversation: CometChat.Conversation): void {
    CometChatUIEventHandler.emitConversationEvent(
      CometChatConversationEvents.ccConversationDeleted,
      { conversation }
    );
  }

}
