package cn.rongcloud.im.wrapper.rn;

import cn.rongcloud.im.wrapper.constants.RCIMIWBlacklistStatus;
import cn.rongcloud.im.wrapper.constants.RCIMIWChatRoomEntriesOperationType;
import cn.rongcloud.im.wrapper.constants.RCIMIWChatRoomStatus;
import cn.rongcloud.im.wrapper.constants.RCIMIWConnectionStatus;
import cn.rongcloud.im.wrapper.constants.RCIMIWConversationType;
import cn.rongcloud.im.wrapper.constants.RCIMIWCustomMessagePolicy;
import cn.rongcloud.im.wrapper.constants.RCIMIWLogLevel;
import cn.rongcloud.im.wrapper.constants.RCIMIWMessageOperationPolicy;
import cn.rongcloud.im.wrapper.constants.RCIMIWMessageType;
import cn.rongcloud.im.wrapper.constants.RCIMIWNativeCustomMessagePersistentFlag;
import cn.rongcloud.im.wrapper.constants.RCIMIWPushNotificationLevel;
import cn.rongcloud.im.wrapper.constants.RCIMIWPushNotificationQuietHoursLevel;
import cn.rongcloud.im.wrapper.constants.RCIMIWReceivedStatus;
import cn.rongcloud.im.wrapper.constants.RCIMIWSentStatus;
import cn.rongcloud.im.wrapper.constants.RCIMIWTimeOrder;
import cn.rongcloud.im.wrapper.constants.RCIMIWUltraGroupTypingStatus;

final class ReactNativeImEnumAdapter {
  private ReactNativeImEnumAdapter() {}

  private static <T extends Enum<T>> T enumFromValue(T[] enums, int[] values, int value) {
    for (int i = 0; i < enums.length && i < values.length; i++) {
      if (values[i] == value) {
        return enums[i];
      }
    }
    return enums.length > 0 ? enums[0] : null;
  }

  private static <T extends Enum<T>> int enumToValue(T[] enums, int[] values, T value) {
    if (value == null) {
      return 0;
    }
    for (int i = 0; i < enums.length && i < values.length; i++) {
      if (enums[i] == value) {
        return values[i];
      }
    }
    return 0;
  }

  private static final RCIMIWBlacklistStatus[] RCIMIWBlacklistStatus_ENUMS =
      new RCIMIWBlacklistStatus[] {
        RCIMIWBlacklistStatus.UNKNOWN,
        RCIMIWBlacklistStatus.IN_BLACKLIST,
        RCIMIWBlacklistStatus.NOT_IN_BLACKLIST
      };
  private static final int[] RCIMIWBlacklistStatus_VALUES = new int[] {0, 1, 2};

  static RCIMIWBlacklistStatus toBlacklistStatus(int value) {
    return enumFromValue(RCIMIWBlacklistStatus_ENUMS, RCIMIWBlacklistStatus_VALUES, value);
  }

  static int fromBlacklistStatus(RCIMIWBlacklistStatus value) {
    return enumToValue(RCIMIWBlacklistStatus_ENUMS, RCIMIWBlacklistStatus_VALUES, value);
  }

  private static final RCIMIWChatRoomEntriesOperationType[]
      RCIMIWChatRoomEntriesOperationType_ENUMS =
          new RCIMIWChatRoomEntriesOperationType[] {
            RCIMIWChatRoomEntriesOperationType.Update, RCIMIWChatRoomEntriesOperationType.Remove
          };
  private static final int[] RCIMIWChatRoomEntriesOperationType_VALUES = new int[] {0, 1};

  static RCIMIWChatRoomEntriesOperationType toChatRoomEntriesOperationType(int value) {
    return enumFromValue(
        RCIMIWChatRoomEntriesOperationType_ENUMS, RCIMIWChatRoomEntriesOperationType_VALUES, value);
  }

  static int fromChatRoomEntriesOperationType(RCIMIWChatRoomEntriesOperationType value) {
    return enumToValue(
        RCIMIWChatRoomEntriesOperationType_ENUMS, RCIMIWChatRoomEntriesOperationType_VALUES, value);
  }

  private static final RCIMIWChatRoomStatus[] RCIMIWChatRoomStatus_ENUMS =
      new RCIMIWChatRoomStatus[] {
        RCIMIWChatRoomStatus.RESET,
        RCIMIWChatRoomStatus.DESTROY_MANUAL,
        RCIMIWChatRoomStatus.DESTROY_AUTO
      };
  private static final int[] RCIMIWChatRoomStatus_VALUES = new int[] {0, 1, 2};

  static RCIMIWChatRoomStatus toChatRoomStatus(int value) {
    return enumFromValue(RCIMIWChatRoomStatus_ENUMS, RCIMIWChatRoomStatus_VALUES, value);
  }

  static int fromChatRoomStatus(RCIMIWChatRoomStatus value) {
    return enumToValue(RCIMIWChatRoomStatus_ENUMS, RCIMIWChatRoomStatus_VALUES, value);
  }

  private static final RCIMIWConnectionStatus[] RCIMIWConnectionStatus_ENUMS =
      new RCIMIWConnectionStatus[] {
        RCIMIWConnectionStatus.NETWORK_UNAVAILABLE,
        RCIMIWConnectionStatus.CONNECTED,
        RCIMIWConnectionStatus.CONNECTING,
        RCIMIWConnectionStatus.UNCONNECTED,
        RCIMIWConnectionStatus.KICKED_OFFLINE_BY_OTHER_CLIENT,
        RCIMIWConnectionStatus.TOKEN_INCORRECT,
        RCIMIWConnectionStatus.CONN_USER_BLOCKED,
        RCIMIWConnectionStatus.SIGN_OUT,
        RCIMIWConnectionStatus.SUSPEND,
        RCIMIWConnectionStatus.TIMEOUT,
        RCIMIWConnectionStatus.UNKNOWN
      };
  private static final int[] RCIMIWConnectionStatus_VALUES =
      new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  static RCIMIWConnectionStatus toConnectionStatus(int value) {
    return enumFromValue(RCIMIWConnectionStatus_ENUMS, RCIMIWConnectionStatus_VALUES, value);
  }

  static int fromConnectionStatus(RCIMIWConnectionStatus value) {
    return enumToValue(RCIMIWConnectionStatus_ENUMS, RCIMIWConnectionStatus_VALUES, value);
  }

  private static final RCIMIWConversationType[] RCIMIWConversationType_ENUMS =
      new RCIMIWConversationType[] {
        RCIMIWConversationType.INVALID,
        RCIMIWConversationType.PRIVATE,
        RCIMIWConversationType.GROUP,
        RCIMIWConversationType.CHATROOM,
        RCIMIWConversationType.SYSTEM,
        RCIMIWConversationType.ULTRA_GROUP
      };
  private static final int[] RCIMIWConversationType_VALUES = new int[] {0, 1, 2, 3, 4, 5};

  static RCIMIWConversationType toConversationType(int value) {
    return enumFromValue(RCIMIWConversationType_ENUMS, RCIMIWConversationType_VALUES, value);
  }

  static int fromConversationType(RCIMIWConversationType value) {
    return enumToValue(RCIMIWConversationType_ENUMS, RCIMIWConversationType_VALUES, value);
  }

  private static final RCIMIWCustomMessagePolicy[] RCIMIWCustomMessagePolicy_ENUMS =
      new RCIMIWCustomMessagePolicy[] {
        RCIMIWCustomMessagePolicy.COMMAND,
        RCIMIWCustomMessagePolicy.NORMAL,
        RCIMIWCustomMessagePolicy.STATUS,
        RCIMIWCustomMessagePolicy.STORAGE
      };
  private static final int[] RCIMIWCustomMessagePolicy_VALUES = new int[] {0, 1, 2, 3};

  static RCIMIWCustomMessagePolicy toCustomMessagePolicy(int value) {
    return enumFromValue(RCIMIWCustomMessagePolicy_ENUMS, RCIMIWCustomMessagePolicy_VALUES, value);
  }

  static int fromCustomMessagePolicy(RCIMIWCustomMessagePolicy value) {
    return enumToValue(RCIMIWCustomMessagePolicy_ENUMS, RCIMIWCustomMessagePolicy_VALUES, value);
  }

  private static final RCIMIWLogLevel[] RCIMIWLogLevel_ENUMS =
      new RCIMIWLogLevel[] {
        RCIMIWLogLevel.NONE,
        RCIMIWLogLevel.ERROR,
        RCIMIWLogLevel.WARN,
        RCIMIWLogLevel.INFO,
        RCIMIWLogLevel.DEBUG,
        RCIMIWLogLevel.VERBOSE
      };
  private static final int[] RCIMIWLogLevel_VALUES = new int[] {0, 1, 2, 3, 4, 5};

  static RCIMIWLogLevel toLogLevel(int value) {
    return enumFromValue(RCIMIWLogLevel_ENUMS, RCIMIWLogLevel_VALUES, value);
  }

  static int fromLogLevel(RCIMIWLogLevel value) {
    return enumToValue(RCIMIWLogLevel_ENUMS, RCIMIWLogLevel_VALUES, value);
  }

  private static final RCIMIWMessageOperationPolicy[] RCIMIWMessageOperationPolicy_ENUMS =
      new RCIMIWMessageOperationPolicy[] {
        RCIMIWMessageOperationPolicy.LOCAL,
        RCIMIWMessageOperationPolicy.REMOTE,
        RCIMIWMessageOperationPolicy.LOCAL_REMOTE
      };
  private static final int[] RCIMIWMessageOperationPolicy_VALUES = new int[] {0, 1, 2};

  static RCIMIWMessageOperationPolicy toMessageOperationPolicy(int value) {
    return enumFromValue(
        RCIMIWMessageOperationPolicy_ENUMS, RCIMIWMessageOperationPolicy_VALUES, value);
  }

  static int fromMessageOperationPolicy(RCIMIWMessageOperationPolicy value) {
    return enumToValue(
        RCIMIWMessageOperationPolicy_ENUMS, RCIMIWMessageOperationPolicy_VALUES, value);
  }

  private static final RCIMIWMessageType[] RCIMIWMessageType_ENUMS =
      new RCIMIWMessageType[] {
        RCIMIWMessageType.UNKNOWN,
        RCIMIWMessageType.CUSTOM,
        RCIMIWMessageType.TEXT,
        RCIMIWMessageType.VOICE,
        RCIMIWMessageType.IMAGE,
        RCIMIWMessageType.FILE,
        RCIMIWMessageType.SIGHT,
        RCIMIWMessageType.GIF,
        RCIMIWMessageType.RECALL,
        RCIMIWMessageType.REFERENCE,
        RCIMIWMessageType.COMMAND,
        RCIMIWMessageType.COMMAND_NOTIFICATION,
        RCIMIWMessageType.LOCATION,
        RCIMIWMessageType.USER_CUSTOM,
        RCIMIWMessageType.NATIVE_CUSTOM,
        RCIMIWMessageType.NATIVE_CUSTOM_MEDIA,
        RCIMIWMessageType.GROUP_NOTIFICATION,
        RCIMIWMessageType.INFORMATION_NOTIFICATION
      };
  private static final int[] RCIMIWMessageType_VALUES =
      new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};

  static RCIMIWMessageType toMessageType(int value) {
    return enumFromValue(RCIMIWMessageType_ENUMS, RCIMIWMessageType_VALUES, value);
  }

  static int fromMessageType(RCIMIWMessageType value) {
    return enumToValue(RCIMIWMessageType_ENUMS, RCIMIWMessageType_VALUES, value);
  }

  private static final RCIMIWNativeCustomMessagePersistentFlag[]
      RCIMIWNativeCustomMessagePersistentFlag_ENUMS =
          new RCIMIWNativeCustomMessagePersistentFlag[] {
            RCIMIWNativeCustomMessagePersistentFlag.NONE,
            RCIMIWNativeCustomMessagePersistentFlag.PERSISTED,
            RCIMIWNativeCustomMessagePersistentFlag.Counted,
            RCIMIWNativeCustomMessagePersistentFlag.STATUS
          };
  private static final int[] RCIMIWNativeCustomMessagePersistentFlag_VALUES =
      new int[] {0, 1, 2, 3};

  static RCIMIWNativeCustomMessagePersistentFlag toNativeCustomMessagePersistentFlag(int value) {
    return enumFromValue(
        RCIMIWNativeCustomMessagePersistentFlag_ENUMS,
        RCIMIWNativeCustomMessagePersistentFlag_VALUES,
        value);
  }

  static int fromNativeCustomMessagePersistentFlag(RCIMIWNativeCustomMessagePersistentFlag value) {
    return enumToValue(
        RCIMIWNativeCustomMessagePersistentFlag_ENUMS,
        RCIMIWNativeCustomMessagePersistentFlag_VALUES,
        value);
  }

  private static final RCIMIWPushNotificationLevel[] RCIMIWPushNotificationLevel_ENUMS =
      new RCIMIWPushNotificationLevel[] {
        RCIMIWPushNotificationLevel.ALL_MESSAGE,
        RCIMIWPushNotificationLevel.NONE,
        RCIMIWPushNotificationLevel.MENTION,
        RCIMIWPushNotificationLevel.MENTION_USERS,
        RCIMIWPushNotificationLevel.MENTION_ALL,
        RCIMIWPushNotificationLevel.BLOCKED
      };
  private static final int[] RCIMIWPushNotificationLevel_VALUES = new int[] {0, 1, 2, 3, 4, 5};

  static RCIMIWPushNotificationLevel toPushNotificationLevel(int value) {
    return enumFromValue(
        RCIMIWPushNotificationLevel_ENUMS, RCIMIWPushNotificationLevel_VALUES, value);
  }

  static int fromPushNotificationLevel(RCIMIWPushNotificationLevel value) {
    return enumToValue(
        RCIMIWPushNotificationLevel_ENUMS, RCIMIWPushNotificationLevel_VALUES, value);
  }

  private static final RCIMIWPushNotificationQuietHoursLevel[]
      RCIMIWPushNotificationQuietHoursLevel_ENUMS =
          new RCIMIWPushNotificationQuietHoursLevel[] {
            RCIMIWPushNotificationQuietHoursLevel.NONE,
            RCIMIWPushNotificationQuietHoursLevel.MENTION_MESSAGE,
            RCIMIWPushNotificationQuietHoursLevel.BLOCKED
          };
  private static final int[] RCIMIWPushNotificationQuietHoursLevel_VALUES = new int[] {0, 1, 2};

  static RCIMIWPushNotificationQuietHoursLevel toPushNotificationQuietHoursLevel(int value) {
    return enumFromValue(
        RCIMIWPushNotificationQuietHoursLevel_ENUMS,
        RCIMIWPushNotificationQuietHoursLevel_VALUES,
        value);
  }

  static int fromPushNotificationQuietHoursLevel(RCIMIWPushNotificationQuietHoursLevel value) {
    return enumToValue(
        RCIMIWPushNotificationQuietHoursLevel_ENUMS,
        RCIMIWPushNotificationQuietHoursLevel_VALUES,
        value);
  }

  private static final RCIMIWReceivedStatus[] RCIMIWReceivedStatus_ENUMS =
      new RCIMIWReceivedStatus[] {
        RCIMIWReceivedStatus.UNREAD,
        RCIMIWReceivedStatus.READ,
        RCIMIWReceivedStatus.LISTENED,
        RCIMIWReceivedStatus.DOWNLOADED,
        RCIMIWReceivedStatus.RETRIEVED,
        RCIMIWReceivedStatus.MULTIPLE_RECEIVE
      };
  private static final int[] RCIMIWReceivedStatus_VALUES = new int[] {0, 1, 2, 3, 4, 5};

  static RCIMIWReceivedStatus toReceivedStatus(int value) {
    return enumFromValue(RCIMIWReceivedStatus_ENUMS, RCIMIWReceivedStatus_VALUES, value);
  }

  static int fromReceivedStatus(RCIMIWReceivedStatus value) {
    return enumToValue(RCIMIWReceivedStatus_ENUMS, RCIMIWReceivedStatus_VALUES, value);
  }

  private static final RCIMIWSentStatus[] RCIMIWSentStatus_ENUMS =
      new RCIMIWSentStatus[] {
        RCIMIWSentStatus.SENDING,
        RCIMIWSentStatus.FAILED,
        RCIMIWSentStatus.SENT,
        RCIMIWSentStatus.RECEIVED,
        RCIMIWSentStatus.READ,
        RCIMIWSentStatus.DESTROYED,
        RCIMIWSentStatus.CANCELED
      };
  private static final int[] RCIMIWSentStatus_VALUES = new int[] {0, 1, 2, 3, 4, 5, 6};

  static RCIMIWSentStatus toSentStatus(int value) {
    return enumFromValue(RCIMIWSentStatus_ENUMS, RCIMIWSentStatus_VALUES, value);
  }

  static int fromSentStatus(RCIMIWSentStatus value) {
    return enumToValue(RCIMIWSentStatus_ENUMS, RCIMIWSentStatus_VALUES, value);
  }

  private static final RCIMIWTimeOrder[] RCIMIWTimeOrder_ENUMS =
      new RCIMIWTimeOrder[] {RCIMIWTimeOrder.BEFORE, RCIMIWTimeOrder.AFTER};
  private static final int[] RCIMIWTimeOrder_VALUES = new int[] {0, 1};

  static RCIMIWTimeOrder toTimeOrder(int value) {
    return enumFromValue(RCIMIWTimeOrder_ENUMS, RCIMIWTimeOrder_VALUES, value);
  }

  static int fromTimeOrder(RCIMIWTimeOrder value) {
    return enumToValue(RCIMIWTimeOrder_ENUMS, RCIMIWTimeOrder_VALUES, value);
  }

  private static final RCIMIWUltraGroupTypingStatus[] RCIMIWUltraGroupTypingStatus_ENUMS =
      new RCIMIWUltraGroupTypingStatus[] {RCIMIWUltraGroupTypingStatus.TEXT};
  private static final int[] RCIMIWUltraGroupTypingStatus_VALUES = new int[] {0};

  static RCIMIWUltraGroupTypingStatus toUltraGroupTypingStatus(int value) {
    return enumFromValue(
        RCIMIWUltraGroupTypingStatus_ENUMS, RCIMIWUltraGroupTypingStatus_VALUES, value);
  }

  static int fromUltraGroupTypingStatus(RCIMIWUltraGroupTypingStatus value) {
    return enumToValue(
        RCIMIWUltraGroupTypingStatus_ENUMS, RCIMIWUltraGroupTypingStatus_VALUES, value);
  }
}
