//
//  RTCXLog.h
//  RTCXLog
//
//  Created by Apple on 2024/8/15.
//

#import <Foundation/Foundation.h>
@class RTCXLogRule;
//! Project version number for RTCXLog.
FOUNDATION_EXPORT double RTCXLogVersionNumber;

//! Project version string for RTCXLog.
FOUNDATION_EXPORT const unsigned char RTCXLogVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <RTCXLog/PublicHeader.h>

#import <RTCXLog/LoggerClient.h>
#import <RTCXLog/RTCXLogMacros.h>

/**
 Level，日志级别，过滤要输出的日志。
 建议App发布上线时，设置为RTCXLogLevelInfo等级，以便收集足够量的APPSDK日志排查线上问题。
 
 */
typedef NS_ENUM(NSUInteger, RTCXLogLevel){
    RTCXLogLevelOff       = 0,
    RTCXLogLevelError     = 1,
    RTCXLogLevelWarning   = 2,
    RTCXLogLevelInfo      = 3,
    RTCXLogLevelDebug     = 4,
    RTCXLogLevelVerbose   = 5
};

/**
 日志模块，提供客户端统一日志打印，日志等级控制，分模块日志隔离等能力，同时支持拓展日志输出的能力。
 */
@interface RTCXLog : NSObject

/**
 注册需要输出日志的 tag
 
 日志模块以 tag 为维度对日志进行等级控制、隔离等操作，建议使用模块名称作为tag。
 
 @param tag 标签
 */
+ (void)registerTag:(NSString *_Nonnull)tag;


/**
 统一设置所有 tag 的显示日志级别，当日志开关开启时，默认RTCXLogLevelVerbose等级；
 
 @param level 日志级别
 */
+ (void)setAllTagsLevel:(RTCXLogLevel) level;


/**
 设置 tag 对应的显示日志级别

 若 tag 未设置级别，默认为全局日志级别。
 
 @param level 日志级别
 @param tag 标签
 */
+ (void)setLevel:(RTCXLogLevel)level forTag:(NSString *_Nonnull)tag;


/**
 设置是否开启日志，默认不开启
 
 @param isDebug 是否开启日志，YES: 开启；NO: 不开启
 */
+ (void)isDebugMode:(BOOL)isDebug;


/**
 是否需要在控制台打印日志，当开启日志开关后，默认日志打印在控制台

 @param isPrint 是否打印在控制台，YES: 打印在控制台；NO: 不打印在控制台，默认YES
 */
+ (void)printInConsole:(BOOL)isPrint;


/**
 Tag 和 Level 的映射表

 */
+(NSArray <RTCXLogRule *>*_Nullable)tagLevelRules;


/**
 设置SDK日志回调，当开启日志开关后，日志会通过该回调输出，方便上层自己存储日志
 
 @param logCallback 日志回调Block
 */
+ (void)setRtcxLogCallback:(nullable void(^)(NSString * _Nullable logMsg))logCallback;

/**
 处理单条日志
 
 日志信息包括 level,tag,方法名，文件名，日志描述
 */
+ (void)logLevel:(RTCXLogLevel)level tag:(id _Nullable )tag file:(const char *_Nullable)file function:(const char *_Nullable)function line:(int)line format:(NSString *_Nullable)format, ...;

/**
 @remark 获取当前SDK版本
 
 @return version 字符串
 */
+ (nonnull NSString *)getCurrentSDKVersion;
@end

/**
 RTCXLogRule 类包含tag和Level的映射关系
 */
@interface RTCXLogRule : NSObject

/**
 tag
 
 用于对日志进行等级控制、隔离等操作，建议使用模块名称作为tag。
 */
@property(nonatomic, copy, readonly) NSString * _Nullable tag;

/**
 日志级别
 
 用于过滤要输出的日志
 */
@property(nonatomic, assign, readonly) RTCXLogLevel  level;
@end
