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

#import <Foundation/Foundation.h>
#import "WXCOMacros.h"

NS_ASSUME_NONNULL_BEGIN

/// 是否需要同步
typedef NS_ENUM(NSInteger, needSyncValue) {
    /// 不需要同步
    needSyncValueNO,
    /// 需要同步
    needSyncValueYES
};

/// 是否需要展示
typedef NS_ENUM(NSInteger, isShowValue) {
    /// 不需要展示
    isShowValueNO,
    /// 需要展示
    isShowValueYES
};

/// 是否需要做过期检查
typedef NS_ENUM(NSInteger, checkExpiredValue) {
    /// 不需要做过期检查
    checkExpiredValueNO,
    /// 需要做过期检查
    checkExpiredValueYES
};

/**
 * 下载模型数据，用于记录下载文件的信息
 *
 * 该模型可以将model保存、查询、更新、删除操作，也就是说下载模块只有该类参与了有关数据的交互。
 * 这种做法的目的是低耦合，以便于以后更换数据库（比如：CoreData、Realm）时，只对该类做修改即可
 */
@interface CODownloadModel : NSObject <NSCopying, NSCoding> // 如果保存的自定义对象不遵守NSCoding的协议或不实现NSCoding协议的方法，就不能使用YYDiskCache进行长期缓存
/// 学习记录所需要的CID
@property (nonatomic, strong) NSString *cid;
/// 下载课件所属的课程ID
@property (nonatomic, strong) NSString *course_id;
/// 下载课件所属的课程名称
@property (nonatomic, strong) NSString *course_name;
/// 下载课件所属的课程类型
@property (nonatomic, strong) NSString *courseType;
/// 课程结构名称
@property (nonatomic, strong) NSString *course_structure_name;
/// 课程结构ID
@property (nonatomic, strong) NSString *course_structure_id;
/// 下载课件所属的父级ID，该值有可能是course_id,也有可能是catalog_id
@property (nonatomic, strong) NSString *parent_id;

/// 下载课件的ID
@property (nonatomic, strong) NSString *lesson_id;
/// 下载课件的课件类型
@property (nonatomic, assign) NSInteger lesson_type;
/// 下载课件的直播类型
@property (nonatomic, assign) NSInteger live_type;
/// 如果是lesson_type == COLessonTypeVideo时，记录视频的时长
@property (nonatomic, strong) NSString *video_length;
/// 回放时的房间号
@property (nonatomic, strong) NSString *offline_code;
/// 中公直播回调鉴权地址
@property (nonatomic, copy) NSString *hook;
/// 鉴权key
@property (nonatomic, copy) NSString *auth_key;

/// 当前已下载的文件大小
@property (nonatomic, assign) NSInteger current_size;
/// 文件的总大小
@property (nonatomic, assign) NSInteger total_size;
/// 下载完成的日期时间
@property (nonatomic, strong) NSString *down_date;
/// 下载文件的名称，可以是课件的名称
@property (nonatomic, strong) NSString *down_name;
/// 下载课件的下载状态
@property (nonatomic, assign) NSInteger down_state;
/// 下载课件的URL。1、视频、PDF的下载地址；2、中公直播回放的password
@property (nonatomic, strong) NSString *down_url;
/// 文件的本地存储文件名
@property (nonatomic, strong) NSString *file_name;

/// PDF的类型，默认是讲义
@property (nonatomic, assign) COPdfType pdf_type;
/// 试卷的难度
@property (nonatomic, strong) NSString *difficulty;
/// 试卷的内容
@property (nonatomic, strong) NSString *paper_content;
/// 试卷的类型
@property (nonatomic, assign) NSInteger paper_type;
/// 试卷样式：1 行测 2 申论 3 混合
@property (nonatomic, strong) NSString *paper_pattern;
/// 模考交卷返回的id
@property (nonatomic, strong) NSString *mock_paper_id;
/// 模考id
@property (nonatomic, strong) NSString *mock_id;

/// 该下载对象信息是否需要同步至服务器，默认值needSyncValueNO
@property (nonatomic, assign) NSInteger need_sync;
/// 该下载对象信息完成下载后是否要向用户显示，默认值isShowValueNO
@property (nonatomic, assign) NSInteger is_show;
/// 该下载对象信息完成下载后是否要检查所附属的course已过期，默认值checkExpiredValueNO
@property (nonatomic, assign) NSInteger check_expired;

/// 获取用户下载全部下载模型数据
/// @return 下载数据
+ (NSMutableArray <CODownloadModel *> *)getUserAllDownloadDataWithUserID:(NSString *)userID;

/// 批量更新model的状态到数据库
/// @param modelArray 下载模型集合
+ (void)batchUpdateDownloadState2Database:(NSMutableArray <CODownloadModel *> *)modelArray;

/// 批量更新model的状态到数据库
/// @param modelArray 下载模型集合
+ (void)batchAddDownloadModel2Database:(NSMutableArray <CODownloadModel *> *)modelArray userID:(NSString *)userID;

/// 获取下载文件的完整本地路径
- (NSString *)getLocalDownloadFullPath;

/// 获取下载文件缓存目录路径
- (NSString *)getLocalDownloadCachePath;

/// 检测文件是否下载完成
/// @return 是否完成下载
- (BOOL)checkDownloadComplete;

/// 课件时长描述信息
/// @return 课件时长描述信息
- (NSString *)lessonVideoLengthDesc;

/// 课件观看进度描述信息
/// @return 课件观看进度描述信息
- (NSString *)lessonWatchProgressDesc;

/// 检查是否是回放课件类型
/// @return 是否是回放类型
- (BOOL)checkPlaybackLessonType;

/// 检查课件类型是否可以在内部（自己写的）下载器中下载
/// @return 是否可以被下载
- (BOOL)checkInsideDownloaderCanDownloadLessonType;

/// 添加模型数据到本地数据库
- (void)addModel2DatabaseWithUserID:(NSString *)userID;

/// 从数据库删除该模型数据
- (void)deleteModelFromDatabaseWithUserID:(NSString *)userID;

/// 更新model至数据库
- (void)updateModel2Database;

@end

/// 下载被拒原因
typedef NS_ENUM(NSInteger, DownloadRejectReason) {
    /// 没有问题，可以正常下载
    DownloadRejectReasonCanDownload,
    /// 数据源为空
    DownloadRejectReasonEmptyData,
    /// 下载地址为空
    DownloadRejectReasonEmptyURL,
    /// 下载类型不支持
    DownloadRejectReasonUnsupported,
    /// 直播回放的房间号为空
    DownloadRejectReasonOfflineCode,
    /// 直播回放口令码为空
    DownloadRejectReasonPassword,
    /// 直播还没有回放
    DownloadRejectReasonNoPlayback,
    /// 本次操作可执行下载的列表为空
    DownloadRejectReasonEmptyList,
    /// 无网络
    DownloadRejectReasonNoNetwork,
    /// 用户不允许在移动网络下执行下载
    DownloadRejectReasonWWANNetwork
};

/**
 下载时被拒绝模型数据，比如：URL为空、类型不支持、回放房间号或者口令码为空等待
 */
@interface CODownloadRejectModel : NSObject

/// 下载课件的ID
@property (nonatomic, strong) NSString *lesson_id;
/// 下载课件的课件类型
@property (nonatomic, assign) NSInteger lesson_type;
/// 被拒绝原因
@property (nonatomic, assign) DownloadRejectReason reason;
/// 下载课件名称
@property (nonatomic, strong) NSString *lesson_name;

@end

@interface CODownloadPaperModel : NSObject
/// 试卷ID
@property (nonatomic, strong) NSString *paper_id;
/// 试卷名称
@property (nonatomic, strong) NSString *paper_name;
/// 试卷的类型
@property (nonatomic, assign) NSInteger examType;
/// 试卷样式：1 行测 2 申论 3 混合
@property (nonatomic, strong) NSString *paper_pattern;
/// 试卷难度
@property (nonatomic, strong) NSString *difficulty;
/// 模考交卷返回的id，ps:申论是没有该值的
@property (nonatomic, strong) NSString *mock_paper_id;
/// 模考id
@property (nonatomic, strong) NSString *mock_id;
/// 试卷的描述（123人已做）
@property (nonatomic , strong) NSString *content;
/// 试卷的下载地址
@property (nonatomic, strong) NSString *download_url;
/// 试卷的文件大小
@property (nonatomic, strong) NSString *pdf_size;

@end

NS_ASSUME_NONNULL_END
