//
//  VeDownloadHelper.h
//  react-native-veplayer
//
//  Created by ByteDance on 2025/2/6.
//  Copyright © 2025 ByteDance. All rights reserved.
//

#import <Foundation/Foundation.h>

@class TTVideoEngineDownloadTask;
@protocol TTVideoEngineDownloaderDelegate;

NS_ASSUME_NONNULL_BEGIN

/**
 * 下载辅助工具类
 * 提供下载任务管理、目录配置等功能
 */
@interface VeDownloadHelper : NSObject

/**
 * 设置下载目录
 * @param subdir 子目录，如果为 nil 或空字符串，则使用默认缓存目录
 */
+ (void)setDownloadDirectoryWithSubdir:(nullable NSString *)subdir;

/**
 * 预热 downloader
 * 触发一次 getAllTasksWithCompletionHandler 让 SDK 完成磁盘加载并将 readAllTask 置为 YES
 * 注意：不通过 bridge 回调到 JS，避免 Release/TestFlight 下回调生命周期问题导致 crash
 */
+ (void)prepareDownloader;

/**
 * 设置最大缓存数量
 * @param maxCacheCount 最大缓存数量
 */
+ (void)setMaxCacheCount:(NSInteger)maxCacheCount;

/**
 * 加载所有下载任务
 * @param completionHandler 回调 hasTask 表示是否有任务
 */
+ (void)loadAllTask:(void (^)(BOOL hasTask))completionHandler;

/**
 * 取回最近一次 loadAllTask 回调对应的任务列表
 * 需在 loadAllTask 的 completionHandler 内或之后调用
 * @return 任务列表
 */
+ (NSArray<TTVideoEngineDownloadTask *> *)getLastLoadedTasks;

/**
 * 全部开始/恢复下载任务
 */
+ (void)resumeAllDownloadTasks;

/**
 * 全部暂停下载任务
 */
+ (void)suspendAllDownloadTasks;

/**
 * 全部删除下载任务
 */
+ (void)removeAllDownloadTasks;

/**
 * 在主线程设置 TTVideoEngineDownloader.delegate
 * 避免 RN 桥子线程设置导致卡死
 * @param delegate 下载代理对象
 * @param completion 完成回调
 */
+ (void)setDownloaderDelegateOnMain:(nullable id)delegate
                         completion:(nullable void (^)(void))completion;

/**
 * 安全地获取任务的 videoId（使用 KVC）
 * @param task 下载任务
 * @return videoId，如果任务没有 videoId 则返回 nil
 */
+ (nullable NSString *)getVideoIdFromTask:(nullable TTVideoEngineDownloadTask *)task;

/**
 * 安全地获取任务的 key（使用 KVC）
 * @param task 下载任务
 * @return key，如果任务没有 key 则返回 nil
 */
+ (nullable NSString *)getKeyFromTask:(nullable TTVideoEngineDownloadTask *)task;

/**
 * 安全地获取任务的 urls（使用 KVC）
 * @param task 下载任务
 * @return urls 数组，如果任务没有 urls 则返回 nil
 */
+ (nullable NSArray *)getUrlsFromTask:(nullable TTVideoEngineDownloadTask *)task;

/**
 * 安全地获取任务的 resolution（使用 KVC）
 * @param task 下载任务
 * @return resolution，如果任务没有 resolution 则返回 nil
 */
+ (nullable NSNumber *)getResolutionFromTask:(nullable TTVideoEngineDownloadTask *)task;

/**
 * 安全地获取任务的 codecType（使用 KVC）
 * @param task 下载任务
 * @return codecType，如果任务没有 codecType 则返回 nil
 */
+ (nullable NSNumber *)getCodecTypeFromTask:(nullable TTVideoEngineDownloadTask *)task;

@end

NS_ASSUME_NONNULL_END
