//
//  CODownloadObject.h
//  classonline
//
//  Created by hyz on 2019/2/25.
//  Copyright © 2019 offcn. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "CODownloadModel.h"

NS_ASSUME_NONNULL_BEGIN

@class CODownloadCell;
@protocol CODownloadObjectDelegate <NSObject>

@optional

/// 更新cell视图
- (void)updateCells;

/// 下载将要被移除时更新视图
- (void)downloadWillBeRemoved;

/// 更新视图控制器中的下载指示视图
- (void)updateDownloadTipView;

@end

/**
 * 文件下载对象，处理文件的下载逻辑，负责和下载器的交互工作
 */
@interface CODownloadObject : NSObject
/// 下载cell对象代理
@property (nonatomic, strong) NSMutableArray <CODownloadCell *> *allCellDelegates;
/// 控制视图下载对象代理
@property (nonatomic, weak) UIViewController<CODownloadObjectDelegate> *downloadVcDelegate;

/// 视图下载对象
@property (nonatomic, weak) id <CODownloadObjectDelegate> downloadDelegate;

/// 下载模型数据
@property (nonatomic, strong) CODownloadModel *downloadModel;
/// 下载、优先、暂停、删除时是否有toast提示
@property (nonatomic, assign) BOOL toastTip;
/// VOD点播下载器
//@property (nonatomic, strong) VodDownLoader *vodDownloader;

/// 初始化下载对象通过下载模型
/// @param downloadModel 下载模型
- (instancetype)initWithDownloadObject:(CODownloadModel *)downloadModel;

/// 获取视频、PDF下载文件的地址
- (NSURL *)getDownloadedFileUrl;

// 开始下载操作
/// @param now 是否要马上进入下载，如果为YES，则要执行插队操作；
///            如果为NO，则进入正常的下载顺序，正在下载中（下载队列未到最大并发量时）、等待下载（下载器已到最大并发量时）。
- (void)downloadStart:(BOOL)now;

// 暂停下载操作
/// @param force 表示该暂停是否是由于一些业务逻辑被迫暂停（非用户手动指定操作），比如：被其他的下载对象插队
- (void)downloadPause:(BOOL)force;

// 暂停下载操作，并设置是否要改变当前的下载状态
/// @param force 表示该暂停是否是由于一些业务逻辑被迫暂停（非用户手动指定操作），比如：被其他的下载对象插队
/// @param change 是否要改变当前的下载状态
- (void)downloadPause:(BOOL)force withChangeDownloadState:(BOOL)change;

/// 移除下载操作
- (void)downloadRemoveWithUserID:(NSString *)userID;

/// 添加下载对象代理，如果已存在，则不需要再次添加，一个下载对象可能会在多个界面显示，所以可能存在多个
/// @param delegateCell 将要添加的下载cell
- (void)addDownloadCellDelegate:(CODownloadCell *)delegateCell;

/// 移除下载对象代理，首先要判断是否存在
/// @param delegateCell 将要移除的下载cell
- (void)removeDownloadCellDelegate:(CODownloadCell *)delegateCell;

/// 移除下载对象代理，首先要判断是否存在
/// @param cellIdentify 下载cell的标识
- (void)removeDownloadCellDelegateByCellIdentify:(NSString *)cellIdentify;

/// 文件丢失需要重新再下载
- (void)againDownloadForFileLose;

/// 下载异常时移除本地文件，目前只针对自己下载器下载的文件做处理
- (BOOL)downloadInteruptRemoveLocalFile;


////////////////////////////////////////////////////////////////////////////////////
/// framework add
/// implement in category
///
/// 说明：以下方法之前存在于 CODownloadObject+OffcnLive.h，并在 CODownloadObject 里面做了调用、为了解耦和抽离，在这里做了声明，但在 CODownloadObject+OffcnLive.m 做了实现，这样的方式是不推荐的。

- (void)addOffcnLiveDownloadDelegate;

/// 获取回放已下载的文件大小
/// @return 已下载的大小
- (NSInteger)getOffcnLiveDownloadedSize;

/// 获取回放的文件总大小
/// @return 回放文件总大小
- (NSInteger)getOffcnLiveDownloadedTotalSize;

/// 开启中公直播回放下载
- (void)startOffcnLiveDownload;

/// 暂停中公直播回放下载
- (void)pauseOffcnLiveDownload;

/// 删除中公直播回放下载
- (void)deleteOffcnLiveDownload;

/// 检测中公直播回放是否下载完成
/// @return 是否已下载完成
- (BOOL)checkOffcnLiveCompleteDownload;

////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
/// 以下方法取自 COPlaybackDownloadManager，同样在这里只是声明，在 CODownloadObject+OffcnLive.m 做了实现

/// new add
+ (void)removeAllOffcnLiveDownloadDelegate;

/// 检测中公直播回放是否下载完成
/// @param passwordStr 回放口令码
/// @return 是否已下载完成
+ (BOOL)checkOffcnLiveCompleteDownload:(NSString *)passwordStr;

@end

NS_ASSUME_NONNULL_END
