//
//  TrroRemoteDelegate.h
//  Pods
//
//  Created by Robin on 2023/5/26.
//

#ifndef TrroControlDelegate_h
#define TrroControlDelegate_h

#import <TRROControl/TrroRemoteDef.h>
#import <TRROControl/TrroMedia.h>

@protocol TrroRemoteDelegate <NSObject>
@optional

/**
 * 出错事件通知
 *
 * @param errorCode 错误码
 * @param errorMsg 错误信息
 */
- (void)onError:(NSInteger)errorCode errorMsg:(NSString *)errorMsg;

/**
 * 网关帧时间戳回调
 * windowId   对应网关流id
 * gwid        返回网关id
 * videotime     网关帧时间戳
 */
- (void)onVideoTimeReport:(NSString *)gwid connFd:(int)connFd videoTime:(long long)videoTime;

/// 时延回调
/// - Parameters:
///   - gwid: 视频来源现场设备id
///   - connFd: 对应视频流接收句柄
///   - latency1: 返回均值估计视频时延ms
///   - latency2: 返回最大估计视频时延ms
///   - videotime: 当前视频帧的现场设备采集时间戳
///   - rcct: 控制信道往返时延ms, 等于视频上行延迟+控制下行延迟
- (void)onAllLatencyReport:(NSString *)gwid
                    connFd:(int)connFd
                  latency1:(long long)latency1
                  latency2:(long long)latency2
                 videotime:(long long)videotime
                      rcct:(int)rcct;

/// 接收来自现场设备信息回调
/// - Parameters:
///   - gwid: 消息来源现场设备id
///   - msg: 消息, 二进制透传
///   - len: 消息长度
///   - qos: 消息来源传输qos， 0:不可靠传输, 1:可靠传输
- (void)onReportData:(NSString *)gwid msg:(NSData *)msg len:(int)len qos:(int)qos;

/**
 * 视频帧回调
 * stream_id   对应网关流id
 * conn_fd     接收视频流的句柄标识
 * data        视频帧数据
 * width       视频宽
 * height      视频高
 * videoTime   当前视频帧的现场设备采集时间戳
 */
- (void)onRemoteFrameData:(NSString *)gwid 
                 streamId:(int)streamId
                   connFd:(int)connFd
                     data:(NSData *)data
                    width:(int)width
                   height:(int)height
                videoTime:(long long)videoTime;

/**
 * @param gwid 视频帧的来源现场设备id
 * @param streamId 视频帧的来源现场设备流id
 * @param connFd 接收视频流的句柄标识
 * @param data 编码的视频图像帧数据
 * @param trroCodec 编码的codec类型
 * @param isKeyFrame 是否是关键帧
 * @param videoTime 当前视频帧的现场设备采集时间戳
 * @param hasUserTime 是否有用户自定义时间戳
 * @param userTime 用户自定义时间戳
 */
- (void)onRemoteEncodedFrame:(NSString *)gwid
                    streamId:(int)streamId
                      connFd:(int)connFd
                        data:(NSData *)data
                   trroCodec:(TrroCodecType)trroCodec 
                  isKeyFrame:(BOOL)isKeyFrame
                   videoTime:(long long)videoTime
                 hasUserTime:(BOOL)hasUserTime
                    userTime:(unsigned long long)userTime;

/// 视频流连接状态回调
/// - Parameters:
///   - gwid: 视频帧的来源现场设备id
///   - streamId: 视频帧的来源现场设备流id
///   - connFd: 接收视频流的句柄标识
///   - state: 视频流连接状态
- (void)onState:(NSString *)gwid streamId:(int)streamId connFd:(int)connFd state:(Trro_State)state;


/// 视频流传输状态回调
/// - Parameters:
///   - connFd: 接收视频流的句柄标识
///   - fps: 每秒帧数目
///   - bps: 每秒数据量
///   - rtt: UDP ping网络往返时间
///   - decd: 解帧数目
///   - jitter: 接收抖动值
///   - packetsLost: 总丢包数目
///   - packetsReceived: 总接收数目
///   - stun: 穿网模式 0：host, 1：srflx, 2：prflx, 3：relay
- (void)onMediaState:(int)connFd
                 fps:(int)fps
                 bps:(int)bps
                 rtt:(int)rtt
                decd:(long long)decd
              jitter:(int)jitter
         packetsLost:(long long)packetsLost
     packetsReceived:(long long)packetsReceived
                stun:(int)stun;

/**
 * field端网络状态信息，server模式时有意义
 *
 * @param gwid field端ID
 * @param streamId field端流ID
 * @param fps field端推送帧率
 * @param bps field端推送码率
 * @param rtt field端封包来回时间
 * @param jitter field端抖动
 * @param lost field端丢包率
 */
- (void)onFieldSideMediaState:(NSString *)gwid
                     streamId:(int)streamId
                          fps:(int)fps
                          bps:(int)bps
                          rtt:(int)rtt
                       jitter:(int)jitter
                         lost:(int)lost;

/**
 * 视频流传输状态回调
 *
 * @param connFd 视频流传输状态回调
 * @param mediaState 媒体相关的详细信息
 */
- (void)onAudioMediaStateInfo:(int)connFd mediaState:(TrroMedia *)mediaState;

/**
 * 回调现场设备操控权限状态通知
 *
 * @param fieldDevId 来源现场设备id
 * @param selfPermission 本设备当前的操控权限，参考TrroPermission， 0 是guest，只有观看权限， 1是master，拥有完全控制权限
 * @param masterDevId 拥有master权限的远端设备id
 */
- (void)onOperationPermissionState:(NSString *)fieldDevId selfPermission:(int)selfPermission masterDevId:(NSString *)masterDevId;

/**
 * @param signalState 信令连接状态枚举
 * 0 连接建立成功   1 连接断开，内部会进行自动重连   2 自动重连成功    3 被踢下线    4 用户名或者密码错误
 */
- (void)onSignalState:(int)signalState;

/**
 * 远端设备音频数据回调
 *
 * @param data 音频PCM数据 10ms 16bits
 * @param length 数据长度
 * @param channel 音频声道数目，如单声道为1，双声道为2，多声道为N
 * @param sampleRate 音频采样率
 */
- (void)onRemoteMixAudioFrame:(NSData *)data length:(int)length channel:(int)channel sampleRate:(int)sampleRate;

/**
 * 诊断信息回调
 *
 * @param gwid 网关id
 * @param type 0: 上行，1：下行
 * @param json 上行： 上行数据包的json格式描述，下行： 下行数据包的json格式描述
 */
- (void)onDiagReport:(NSString *)gwid type:(int)type json:(NSString *)json;

/// 统一日志回调
/// @param tag   日志TAG
/// @param msg   日志内容
/// @param level 日志级别， [TRRO-Native] 参考TrroLog_Level， [TRRO-Xxx] 参考TrroLog_SDKLevel
- (void)onLog:(NSString *)tag msg:(NSString *)msg level:(int)level;

/// 音频流连接状态回调
/// - Parameters:
///   - gwid: 视频帧的来源现场设备id
///   - upOrDown: 0:上行 1:下行
///   - state:视频流连接状态，对应TrroState状态
- (void)onAudioState:(NSString *)gwid upOrDown:(int)upOrDown state:(int)state;

/// 控制流连接状态回调
/// - Parameters:
///   - gwid: 视频帧的来源现场设备id
///   - state:视频流连接状态，对应TrroState状态
- (void)onControlState:(NSString *)gwid state:(int)state;

@end

#endif /* TrroControlDelegate_h */
