//
//  TrroRemoteDef.h
//  TrroIOS
//
//  Created by Robin on 2023/5/24.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(NSInteger, TrroError) {
    
    /* 通用错误码 */
    Trro_SUCCED             = 0x00000001,  // 1
    Trro_GWID_NOT_FOUND     = 0x00000010,  // 16
    Trro_PARAM_INVALID      = 0x00F00000,  // 15728640
    Trro_COMMON_ERROR       = 0x00FFFFFF,  // 16777215 参数输入或初始化状态异常

    /* 配置文件加载模块 */
    Trro_CONFIG_ERROR         = 0x01FFFFFF,  // 33554431:配置模块通用失败
    Trro_CONFIG_PARSE_FAILED  = 0x01000002,  // 16777218:配置文件格式异常，最常见
    Trro_CONFIG_ILLEGAL       = 0x01000003,  // 16777219:参数格式非法，需新增参数检查
    Trro_CONFIG_UNEXIST       = 0x01000004,  // 16777220:配置文件不存在
    Trro_CONFIG_CER_FAILED    = 0x01000005,  // 16777221:云证书错误

    /* 初始化模块，对应接口TrroLinux_start */
    Trro_INIT_ERROR                     = 0x02FFFFFF,   // 50331647:初始化通用失败
    Trro_INIT_INPUT_ILLEGAL             = 0x02000002,   // 33554434:初始化参数异常
    Trro_INIT_PARSE_fAILED              = 0x02000003,   // 33554435:配置节点解析异常
    Trro_INIT_CREAT_MEDIAMODE_FAILED    = 0x02000004,   // 33554436:媒体模块创建失败
    Trro_INIT_LICENSE_CHECK_FAILED      = 0x02000005,   // 33554437:LICENSE校验失败
    Trro_INIT_INVALUDE_INPUT            = 0x02000006,   // 33554438:非法输入
    Trro_INIT_MQTT_ABNORMAL             =  0x02000007,  // 33554439: 初始化mqtt异常
    Trro_INIT_REPEAT                    = 0x02000008,   // 33554440:重复初始化

    /* 信令服务器模块 */
    Trro_SIGNAL_ERROR           = 0x03FFFFFF,   // 67108863
    Trro_SIGNAL_REGIST_FAILED   = 0x03000002,   // 50331650:信令注册失败
    Trro_SIGNAL_STATUS_ABNORMAL = 0x03000003,   // 50331651:信令服务器连接异常
    Trro_SIGNAL_MESSAGE_FAILED  = 0x03000004,   // 50331652:信令消息处理失败
    Trro_SIGNAL_CONNECT_OUTTIME = 0x03000005,   // 50331653:信令服务器连接超时

    /* 流采集模块 */
    Trro_CAPTURE_ERROR               = 0x04FFFFFF,   // 83886079
    Trro_CAPTURE_OPENDEVICE_FAILED   = 0x04000002,   // 67108866:打开设备失败
    Trro_CAPTURE_GETSOURCE_FAILED    = 0x04000003,   // 67108867:获取数据源失败
    Trro_CAPTURE_UNKNOWN_CAPTURETYPE = 0x04000004,   // 67108868:未知采集类型

    /* 流传输模块 */
    Trro_CONNECT_ERROR      = 0x05FFFFFF,   // 100663295
    Trro_CONNECT_OUTTIME    = 0x05000002,   // 83886082:超时断连
    Trro_CONNECT_RESET      = 0x05000003,   // 83886083:connect的时候如果之前有未断开的连接需要重置
    Trro_CONNECT_MODE       = 0x05000004,   // 83886084:connect网关的连接mode不支持

    /* 诊断工具模块 */
    Trro_DIAG_STARTED       = 0x06000000,   // 100663296: 诊断工具正在启动中
    Trro_DIAG_TIMEOUT       = 0x06000001,   // 100663297: 诊断工具获取推流信息超时
    Trro_DIAG_FAILED        = 0x06000002,   // 100663298: 诊断工具处理失败

    /* 权限相关 */
    Trro_UNAUTHORIZED       = 0x07000000,   // 117440512: 网关未授权无法发送消息

    /* 消息通道 */
    Trro_MESSAGE_BYTE_EXCEED = 0x08000002,   // 134217730: 发送字节数超出限制
};

typedef NS_ENUM(int, Trro_Permission) {
    Trro_Permission_Guest = 0,
    Trro_Permission_Master = 1,
};

typedef NS_ENUM(NSUInteger, Trro_State) {
    Trro_Disconnect     = 0,
    Trro_Connecting     = 1,
    Trro_Connected      = 2,
    Trro_Disconnecting  = 3,
};

/// Native日志级别
typedef NS_ENUM(NSUInteger, TrroLog_Level) {
    TrroLog_Info    = 1,
    TrroLog_Warning = 2,
    TrroLog_Error   = 3,
};

/// 上层 SDK 日志级别
typedef NS_ENUM(NSInteger, TrroLog_SDKLevel) {
    TrroSDKLog_Verbose = 0,
    TrroSDKLog_Debug   = 1,
    TrroSDKLog_Info    = 2,
    TrroSDKLog_Warn    = 3,
    TrroSDKLog_Error   = 4,
    TrroSDKLog_Assert  = 5,
};

typedef NS_ENUM(NSInteger, Trro_FrameType) {
    Trro_FrameType_I420 = 0,
    Trro_FrameType_ARGB = 1,
    Trro_FrameType_RGB = 2,
    Trro_FrameType_NV12 = 3,
};

typedef NS_ENUM(NSInteger, TrroCodecType) {
    TrroCodecType_H264 = 0,
    TrroCodecType_H265 = 1,
    TrroCodecType_AV1 = 2,
    TrroCodecType_OPUS = 20,
};

typedef NS_ENUM(NSInteger, TrroLogEnable) {
    TrroLogClose     = 0,
    TrroLogRunInfo   = 1,
    TrroLogTrroDaily = 2,
};

typedef NS_ENUM(NSUInteger, Trro_SignalState) {
    Trro_SignalState_Ready = 0,     ///< 链接建立成功
    Trro_SignalState_Lost = 1,      ///< 连接断开，内部会进行自动重连
    Trro_SignalState_Reup = 2,      ///< 自动重连成功
    Trro_SignalState_Kickout = 3,
    Trro_SignalState_AuthFailed = 4, ///< 用户名或者密码错误
};

/**
 * 2.5 视频画面旋转方向
 *
 * TRTC 提供了对本地和远程画面的旋转角度设置 API，下列的旋转角度都是指顺时针方向的。
 */
typedef NS_ENUM(NSInteger, TrroVideoRotation) {
    ///不旋转。
    TrroVideoRotation_0 = 0,
    ///顺时针旋转90度。
    TrroVideoRotation_90 = 1,
    ///顺时针旋转180度。
    TrroVideoRotation_180 = 2,
    ///顺时针旋转270度。
    TrroVideoRotation_270 = 3,
};

/**
 * 2.4 视频画面填充模式
 *
 * 如果视频显示区域的宽高比不等于视频内容的宽高比时，需要指定画面的填充模式。
 */
typedef NS_ENUM(NSInteger, TrroVideoFillMode) {
    ///填充模式：即将画面内容居中等比缩放以充满整个显示区域，超出显示区域的部分将会被裁剪掉，此模式下画面可能不完整。
    TrroVideoFillMode_Fill = 0,
    ///适应模式：即按画面长边进行缩放以适应显示区域，短边部分会被填充为黑色，此模式下图像完整但可能留有黑边。
    TrroVideoFillMode_Fit = 1,
};

/**
 * 采集协议，使用硬编码
 */
typedef NSString * TrroStreamProtocol NS_TYPED_ENUM;
FOUNDATION_EXTERN TrroStreamProtocol const PROTOCOL_HARDWARE_ENCODER;
FOUNDATION_EXTERN TrroStreamProtocol const PROTOCOL_SOFTWARE_ENCODER;

/// stream config 相机类型
typedef NS_ENUM(NSUInteger, TrroCameraType) {
    TrroCameraTypeFront = 0,
    TrroCameraTypeBack = 1,
    TrroCameraTypeExternal = 2,
};

NS_ASSUME_NONNULL_END
