//
//  EZBusinessTool.h
//  EZOpenSDKDemo
//
//  Created by JuneCheng on 2022/2/15.
//  Copyright © 2022 hikvision. All rights reserved.
//

#import <Foundation/Foundation.h>
@class EZDeviceInfo;
@class EZCameraInfo;
@class EZDeviceDetailPublicInfo;
@class EZCloudRecordFile;
@class EZDeviceRecordFile;

NS_ASSUME_NONNULL_BEGIN

@interface EZBusinessTool : NSObject

#pragma mark - 预览

/** 根据videoLevel获取设备视频质量名，0-流畅，1-均衡，2-高清，3-超清，4-极清，5-3K，6-4K */
+ (NSString *)getDeviceQualityTitle:(NSInteger)videoLevel;

/** 获取比当前清晰度高一级的清晰度 */
+ (NSInteger)getHigherVideoLevel:(NSInteger)currentVideoLevel deviceDetailPublicInfo:(EZDeviceDetailPublicInfo *)deviceDetailPublicInfo;

/** 获取比当前清晰度低一级的清晰度 */
+ (NSInteger)getLowerVideoLevel:(NSInteger)currentVideoLevel deviceDetailPublicInfo:(EZDeviceDetailPublicInfo *)deviceDetailPublicInfo;

/** 根据type获取取流方式名 */
+ (NSString *)getStreamType:(int)type;

/** 根据type获取视频编码格式 */
+ (NSString *)getVideoEncodeType:(int)type;

/** 根据type获取视频解码方式 */
+ (NSString *)getDecodeType:(int)type;

/** 根据设备型号判断是否是HUB设备 */
+ (BOOL)isHubDevice:(NSString *)deviceType;

/** 检查是否有对讲权限 */
+ (void)checkMicPermissionResult:(void(^)(BOOL enable))retCb;

/** 检查是否有相机权限 */
+ (void)checkCameraPermissionResult:(void(^)(BOOL enable))retCb;

#pragma mark - 能力集判断

/** 是否支持对讲 */
+ (NSInteger)isSupportTalk:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 是否支持云台 */
+ (BOOL)isSupportPTZ:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 是否支持内网直连时倍数设置 */
+ (BOOL)isSupportDirectInnerRelaySpeed:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 是否支持回放倍率设置 */
+ (BOOL)isSupportPlaybackRate:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 是否支持回放慢速(0.5倍、2倍) */
+ (BOOL)isSupportPlaybackSmallSpeed:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 获取回放最大倍速，=1代表最大倍速=1(不支持倍速)，=2代表最大倍速=2(可渲染: 2倍)，=4代表最大倍速=4(可渲染: 2、4倍)，=8代表最大倍速=8(可渲染: 2、4、8倍)，=16代表最大倍速=16(可渲染: 2、4、8、16倍) */
+ (int)getPlaybackMaxSpeed:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 是否支持SD卡录像封面 */
+ (BOOL)isSupportSdCover:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 是否支持SD卡录像下载 */
+ (BOOL)isSupportSDRecordDownload:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 是否支持双目 */
+ (BOOL)isSupportMultiChannel:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 是否支持自动清晰度 */
+ (BOOL)isSupportDeviceAutoVideolevel:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo;

/** 获取设备热点前缀 */
+ (NSString *)getWiFiConfigPrefix:(NSInteger)deviceHotSpot;

#pragma mark - 回放倍数工具方法

/**
 * 获取云录像支持的倍数数组
 * 云录像默认支持 0.5、1、2、4、8、16、32
 * @return 倍数数组，元素为 NSNumber(EZPlaybackRate)
 */
+ (NSArray<NSNumber *> *)getCloudPlaybackRates;

/**
 * 获取云录像支持的倍数显示字符串数组
 * @return 倍数字符串数组，如 @[@"x0.5", @"x1", @"x2", @"x4", @"x8", @"x16", @"x32"]
 */
+ (NSArray<NSString *> *)getCloudPlaybackRateStrings;

/**
 * 获取SD卡录像支持的倍数数组
 * 规则：
 * 1. 先判断设备是否支持倍数回放(isSupportPlaybackRate)
 *    1.1 如果支持，通过 isSupportPlaybackSmallSpeed 和 getPlaybackMaxSpeed 获取支持倍数
 *        1.1.1 isSupportPlaybackSmallSpeed = YES：支持0.5、2倍；= NO：不支持0.5、2倍
 *        1.1.2 getPlaybackMaxSpeed = -1：默认支持1、4、8、16倍；= 1：不支持倍数；= 4：支持1、4；= 8：支持1、4、8；= 16：支持1、4、8、16
 *    1.2 如果不支持，判断是否内网直连(streamFetchType==2) && 支持内网直连倍数(isSupportDirectInnerRelaySpeed)
 *        - 是：返回 1、4、8 倍数
 *        - 否：返回 nil，表示不支持倍数回放
 */
+ (NSArray<NSNumber *> *_Nullable)getSDCardPlaybackRates:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo streamFetchType:(int)streamFetchType;

/**
 * 获取SD卡录像支持的倍数显示字符串数组
 * @param deviceInfo 设备信息
 * @param cameraInfo 通道信息
 * @param streamFetchType 取流类型，2代表内网直连
 * @return 倍数字符串数组，nil表示不支持倍数回放
 */
+ (NSArray<NSString *> *_Nullable)getSDCardPlaybackRateStrings:(EZDeviceInfo *)deviceInfo cameraInfo:(EZCameraInfo *)cameraInfo streamFetchType:(int)streamFetchType;

#pragma mark - 回放工具方法

/** 获取录像列表中最近时间的结束时间（列表倒序排列，第一个即为最近） */
+ (NSDate *_Nullable)getLatestStopTimeFromCloudRecords:(NSArray<EZCloudRecordFile *> *)records;

/** 获取录像列表中最近时间的结束时间（列表倒序排列，第一个即为最近） */
+ (NSDate *_Nullable)getLatestStopTimeFromDeviceRecords:(NSArray<EZDeviceRecordFile *> *)records;

/** 根据时间戳在云录像列表中查找对应的片段索引，未找到返回 NSNotFound */
+ (NSUInteger)findCloudRecordIndexByTime:(NSDate *)osdTime records:(NSArray<EZCloudRecordFile *> *)records;

/** 根据时间戳在SD卡录像列表中查找对应的片段索引，未找到返回 NSNotFound */
+ (NSUInteger)findDeviceRecordIndexByTime:(NSDate *)osdTime records:(NSArray<EZDeviceRecordFile *> *)records;

#pragma mark - 其他方法

+ (void)judgeRect:(CGRect *)rect;

@end

NS_ASSUME_NONNULL_END
