// Copyright © 2022 BytePlusRTC All rights reserved.
// SPDX-License-Identifier: MIT

package com.volcengine.reactnative.vertc.events;

import com.ss.bytertc.engine.RTCRoomConfig;
import com.ss.bytertc.engine.data.AudioPropertiesInfo;
import com.ss.bytertc.engine.data.PublishState;
import com.ss.bytertc.engine.data.PublishStateChangeReason;
import com.ss.bytertc.engine.data.RemoteVideoConfig;
import com.ss.bytertc.engine.data.SubscribeState;
import com.ss.bytertc.engine.data.SubscribeStateChangeReason;
import com.ss.bytertc.engine.handler.IRTCRoomEventHandler;
import com.ss.bytertc.engine.handler.IRTCVideoEventHandler;
import com.ss.bytertc.engine.SysStats;
import com.ss.bytertc.engine.data.AudioMixingError;
import com.ss.bytertc.engine.data.AudioMixingState;
import com.ss.bytertc.engine.data.AudioPlaybackDevice;
import com.ss.bytertc.engine.data.AudioRoute;
import com.ss.bytertc.engine.data.DataMessageSourceType;
import com.ss.bytertc.engine.data.DeadLockMsg;
import com.ss.bytertc.engine.data.FrameUpdateInfo;
import com.ss.bytertc.engine.data.LocalAudioPropertiesInfo;
import com.ss.bytertc.engine.data.LocalAudioStreamError;
import com.ss.bytertc.engine.data.LocalAudioStreamState;
import com.ss.bytertc.engine.data.MuteState;
import com.ss.bytertc.engine.data.RecordingInfo;
import com.ss.bytertc.engine.data.RecordingProgress;
import com.ss.bytertc.engine.data.RemoteAudioPropertiesInfo;
import com.ss.bytertc.engine.data.RemoteAudioState;
import com.ss.bytertc.engine.data.RemoteAudioStateChangeReason;
import com.ss.bytertc.engine.data.RemoteStreamKey;
import com.ss.bytertc.engine.data.StreamIndex;
import com.ss.bytertc.engine.data.StreamSycnInfoConfig;
import com.ss.bytertc.engine.data.VideoDenoiseMode;
import com.ss.bytertc.engine.data.VideoDenoiseModeChangedReason;
import com.ss.bytertc.engine.data.VideoFrameInfo;
import com.ss.bytertc.engine.data.VideoSuperResolutionMode;
import com.ss.bytertc.engine.data.VideoSuperResolutionModeChangedReason;
import com.ss.bytertc.engine.type.AudioDeviceType;
import com.ss.bytertc.engine.type.AudioDumpStatus;
import com.ss.bytertc.engine.type.AudioRecordingErrorCode;
import com.ss.bytertc.engine.type.AudioRecordingState;
import com.ss.bytertc.engine.type.EchoTestResult;
import com.ss.bytertc.engine.type.EffectErrorType;
import com.ss.bytertc.engine.type.FirstFramePlayState;
import com.ss.bytertc.engine.type.FirstFrameSendState;
import com.ss.bytertc.engine.type.HardwareEchoDetectionResult;
import com.ss.bytertc.engine.type.LocalProxyError;
import com.ss.bytertc.engine.type.LocalProxyState;
import com.ss.bytertc.engine.type.LocalProxyType;
import com.ss.bytertc.engine.type.LocalVideoStreamError;
import com.ss.bytertc.engine.type.LocalVideoStreamState;
import com.ss.bytertc.engine.type.MediaDeviceError;
import com.ss.bytertc.engine.type.MediaDeviceState;
import com.ss.bytertc.engine.type.NetworkDetectionLinkType;
import com.ss.bytertc.engine.type.NetworkDetectionStopReason;
import com.ss.bytertc.engine.type.PerformanceAlarmMode;
import com.ss.bytertc.engine.type.PerformanceAlarmReason;
import com.ss.bytertc.engine.type.PublicStreamErrorCode;
import com.ss.bytertc.engine.type.RecordingErrorCode;
import com.ss.bytertc.engine.type.RecordingState;
import com.ss.bytertc.engine.type.RemoteStreamSwitch;
import com.ss.bytertc.engine.type.RemoteVideoState;
import com.ss.bytertc.engine.type.RemoteVideoStateChangeReason;
import com.ss.bytertc.engine.type.RenderError;
import com.ss.bytertc.engine.type.RtcUser;
import com.ss.bytertc.engine.type.SEIStreamUpdateEvent;
import com.ss.bytertc.engine.type.SourceWantedData;
import com.ss.bytertc.engine.type.VideoDeviceType;
import com.ss.bytertc.engine.utils.LogUtil;
import com.ss.bytertc.engine.RTCStream;
import com.ss.bytertc.engine.SubscribeConfig;
import com.ss.bytertc.engine.UserInfo;
import com.ss.bytertc.engine.data.AVSyncState;
import com.ss.bytertc.engine.data.ForwardStreamEventInfo;
import com.ss.bytertc.engine.data.ForwardStreamStateInfo;
import com.ss.bytertc.engine.type.LocalStreamStats;
import com.ss.bytertc.engine.type.MediaStreamType;
import com.ss.bytertc.engine.type.NetworkQualityStats;
import com.ss.bytertc.engine.type.RTCRoomStats;
import com.ss.bytertc.engine.type.RemoteStreamStats;
import com.ss.bytertc.engine.type.SetRoomExtraInfoResult;
import com.ss.bytertc.engine.type.StreamRemoveReason;
import com.ss.bytertc.engine.type.SubtitleErrorCode;
import com.ss.bytertc.engine.type.SubtitleMessage;
import com.ss.bytertc.engine.type.SubtitleState;
import com.ss.bytertc.engine.type.UserVisibilityChangeError;
import com.volcengine.VolcApiEngine.BeanFactory;
import com.volcengine.VolcApiEngine.runtime.Util;

public class ClassHelper {
  private static boolean initialized = false;
  public static synchronized void init() {
    if (initialized) {
      return;
    }
    BeanFactory.register(IRTCVideoEventHandler.class, IRTCVideoEventHandlerImpl.class);
    BeanFactory.register(IRTCRoomEventHandler.class, IRTCRoomEventHandlerImpl.class);
    Util.JsonAbleClass.add(SysStats.class);
    Util.JsonAbleClass.add(AudioMixingError.class);
    Util.JsonAbleClass.add(AudioMixingState.class);
    Util.JsonAbleClass.add(AudioPlaybackDevice.class);
    Util.JsonAbleClass.add(AudioRoute.class);
    Util.JsonAbleClass.add(DataMessageSourceType.class);
    Util.JsonAbleClass.add(DeadLockMsg.class);
    Util.JsonAbleClass.add(FrameUpdateInfo.class);
    Util.JsonAbleClass.add(LocalAudioPropertiesInfo.class);
    Util.JsonAbleClass.add(LocalAudioStreamError.class);
    Util.JsonAbleClass.add(LocalAudioStreamState.class);
    Util.JsonAbleClass.add(MuteState.class);
    Util.JsonAbleClass.add(RecordingInfo.class);
    Util.JsonAbleClass.add(RecordingProgress.class);
    Util.JsonAbleClass.add(RemoteAudioPropertiesInfo.class);
    Util.JsonAbleClass.add(RemoteAudioState.class);
    Util.JsonAbleClass.add(RemoteAudioStateChangeReason.class);
    Util.JsonAbleClass.add(RemoteStreamKey.class);
    Util.JsonAbleClass.add(StreamIndex.class);
    Util.JsonAbleClass.add(StreamSycnInfoConfig.class);
    Util.JsonAbleClass.add(VideoDenoiseMode.class);
    Util.JsonAbleClass.add(VideoDenoiseModeChangedReason.class);
    Util.JsonAbleClass.add(VideoFrameInfo.class);
    Util.JsonAbleClass.add(VideoSuperResolutionMode.class);
    Util.JsonAbleClass.add(VideoSuperResolutionModeChangedReason.class);
    Util.JsonAbleClass.add(IRTCVideoEventHandler.class);
    Util.JsonAbleClass.add(AudioDeviceType.class);
    Util.JsonAbleClass.add(AudioDumpStatus.class);
    Util.JsonAbleClass.add(AudioRecordingErrorCode.class);
    Util.JsonAbleClass.add(AudioRecordingState.class);
    Util.JsonAbleClass.add(EchoTestResult.class);
    Util.JsonAbleClass.add(EffectErrorType.class);
    Util.JsonAbleClass.add(FirstFramePlayState.class);
    Util.JsonAbleClass.add(FirstFrameSendState.class);
    Util.JsonAbleClass.add(HardwareEchoDetectionResult.class);
    Util.JsonAbleClass.add(LocalProxyError.class);
    Util.JsonAbleClass.add(LocalProxyState.class);
    Util.JsonAbleClass.add(LocalProxyType.class);
    Util.JsonAbleClass.add(LocalVideoStreamError.class);
    Util.JsonAbleClass.add(LocalVideoStreamState.class);
    Util.JsonAbleClass.add(NetworkDetectionLinkType.class);
    Util.JsonAbleClass.add(NetworkDetectionStopReason.class);
    Util.JsonAbleClass.add(PerformanceAlarmMode.class);
    Util.JsonAbleClass.add(PerformanceAlarmReason.class);
    Util.JsonAbleClass.add(PublicStreamErrorCode.class);
    Util.JsonAbleClass.add(RecordingErrorCode.class);
    Util.JsonAbleClass.add(RecordingState.class);
    Util.JsonAbleClass.add(RemoteStreamSwitch.class);
    Util.JsonAbleClass.add(RemoteVideoState.class);
    Util.JsonAbleClass.add(RemoteVideoStateChangeReason.class);
    Util.JsonAbleClass.add(RenderError.class);
    Util.JsonAbleClass.add(RtcUser.class);
    Util.JsonAbleClass.add(SEIStreamUpdateEvent.class);
    Util.JsonAbleClass.add(SourceWantedData.class);
    Util.JsonAbleClass.add(VideoDeviceType.class);
    Util.JsonAbleClass.add(LogUtil.class);
    Util.JsonAbleClass.add(RTCStream.class);
    Util.JsonAbleClass.add(SubscribeConfig.class);
    Util.JsonAbleClass.add(UserInfo.class);
    Util.JsonAbleClass.add(AVSyncState.class);
    Util.JsonAbleClass.add(ForwardStreamEventInfo.class);
    Util.JsonAbleClass.add(ForwardStreamStateInfo.class);
    Util.JsonAbleClass.add(IRTCRoomEventHandler.class);
    Util.JsonAbleClass.add(LocalStreamStats.class);
    Util.JsonAbleClass.add(MediaStreamType.class);
    Util.JsonAbleClass.add(NetworkQualityStats.class);
    Util.JsonAbleClass.add(RTCRoomStats.class);
    Util.JsonAbleClass.add(RemoteStreamStats.class);
    Util.JsonAbleClass.add(SetRoomExtraInfoResult.class);
    Util.JsonAbleClass.add(StreamRemoveReason.class);
    Util.JsonAbleClass.add(SubtitleErrorCode.class);
    Util.JsonAbleClass.add(SubtitleMessage.class);
    Util.JsonAbleClass.add(SubtitleState.class);
    Util.JsonAbleClass.add(UserVisibilityChangeError.class);
    Util.JsonAbleClass.add(PublishStateChangeReason.class);
    Util.JsonAbleClass.add(PublishState.class);
    Util.JsonAbleClass.add(SubscribeStateChangeReason.class);
    Util.JsonAbleClass.add(SubscribeState.class);
    Util.JsonAbleClass.add(RemoteVideoConfig.class);
    Util.JsonAbleClass.add(RTCRoomConfig.class);
    Util.JsonAbleClass.add(MediaDeviceState.class);
    Util.JsonAbleClass.add(MediaDeviceError.class);
    Util.JsonAbleClass.add(AudioPropertiesInfo.class);
    initialized = true;
  }
}
