//
//  WindMillRewardVideoAd.h
//  WindSDK
//
//  Created by Codi on 2021/4/19.
//  Copyright © 2021 Codi. All rights reserved.
//

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

@class WindMillAdInfo;
@class WindMillAdRequest;
@class WindMillRewardInfo;
@class WindMillRewardVideoAd;
@class WindMillAdFilter;

NS_ASSUME_NONNULL_BEGIN

@protocol WindMillRewardVideoAdDelegate<NSObject>

@required

/// 广告获得激励时回调
/// - Parameters:
///   - rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - reward: 激励信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd reward:(WindMillRewardInfo *)reward;

@optional

/// 广告加载成功
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdDidLoad:(WindMillRewardVideoAd *)rewardVideoAd;

/// 广告加载失败
/// - Parameters:
///   - rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - error: 具体错误信息
- (void)rewardVideoAdDidLoad:(WindMillRewardVideoAd *)rewardVideoAd didFailWithError:(NSError *_Nullable)error;

/// 广告即将曝光回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdWillVisible:(WindMillRewardVideoAd *)rewardVideoAd;

/// 广告曝光回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdDidVisible:(WindMillRewardVideoAd *)rewardVideoAd;

/// 广告播放失败回调
/// - Parameters:
///   - rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - error: 具体错误信息
- (void)rewardVideoAdDidShowFailed:(WindMillRewardVideoAd *)rewardVideoAd error:(NSError *_Nullable)error;

/// 广告点击回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdDidClick:(WindMillRewardVideoAd *)rewardVideoAd;

/// 广告跳过回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdDidClickSkip:(WindMillRewardVideoAd *)rewardVideoAd;

/// 广告即将关闭
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdWillClose:(WindMillRewardVideoAd *)rewardVideoAd;

/// 广告闭关回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdDidClose:(WindMillRewardVideoAd *)rewardVideoAd;

/// 广告视频播放完成或者视频播放出错
/// - Parameters:
///   - rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - error: 具体错误信息
- (void)rewardVideoAdDidPlayFinish:(WindMillRewardVideoAd *)rewardVideoAd didFailWithError:(NSError * _Nullable)error;

/// 广告播放中加载成功
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdDidAutoLoad:(WindMillRewardVideoAd *)rewardVideoAd;

/// 广告播放中加载失败
/// - Parameters:
///   - rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - error: 具体错误信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd didAutoLoadFailWithError:(NSError *_Nullable)error;


/// 竞价广告源开始竞价回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - rewardVideoAd: 激励信息
///   - adInfo: 广告的相关信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd didStartBidADSource:(WindMillAdInfo *)adInfo;

/// 竞价广告源竞价成功回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - rewardVideoAd: 激励信息
///   - adInfo: 广告的相关信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd didFinishBidADSource:(WindMillAdInfo *)adInfo;

/// 竞价广告源竞价失败回调，以及失败原因
/// - Parameters:
///   - rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - adInfo: 具体错误信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd didFailBidADSource:(WindMillAdInfo *)adInfo error:(NSError *_Nullable)error;

/// 广告源开始加载回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - rewardVideoAd: 激励信息
///   - adInfo: 广告的相关信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd didStartLoadingADSource:(WindMillAdInfo *)adInfo;

/// 广告源广告填充回调
/// - Parameter rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - rewardVideoAd: 激励信息
///   - adInfo: 广告的相关信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd didFinishLoadingADSource:(WindMillAdInfo *)adInfo;

/// 广告源加载失败回调，以及失败原因
/// - Parameters:
///   - rewardVideoAd: WindMillRewardVideoAd 实例对象
///   - error: 具体错误信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd didFailToLoadADSource:(WindMillAdInfo *)adInfo error:(NSError *_Nullable)error;

@end

@interface WindMillRewardVideoAd : NSObject

/// 广告代理对象
@property (nonatomic, weak, nullable) id<WindMillRewardVideoAdDelegate> delegate;

/// 广告位ID
@property (nonatomic, strong, readonly, nonnull) NSString *placementId;

/// 广告是否有效
@property (nonatomic, getter=isAdReady, readonly) BOOL ready;

/// 当前播放广告的相关信息
@property (nonatomic, strong, readonly, nullable) WindMillAdInfo *adInfo;

/// 构造器
/// - Parameter request: 广告请求模型，可以设置广告位ID等参数
- (instancetype)initWithRequest:(WindMillAdRequest *)request;

/// 重置自定义参数方法
- (void)resetRequestOptions:(NSDictionary<NSString *, NSString *> * _Nullable)options;

/// 加载广告
- (void)loadAdData;

/// 填充后可调用, 返回广告缓存池内所有信息
- (nullable NSArray<WindMillAdInfo *> *)getCacheAdInfoList;

/// 播放广告
/// @param rootViewController 播放广告所需要的ViewController
/// @param extras 扩展参数，用于设置播放时的代码位场景
- (void)showAdFromRootViewController:(UIViewController *)rootViewController
                             options:(NSDictionary<NSString *, NSString *> * _Nullable)extras;

/// 自定义分组规则支持单次广告load维度设置
- (void)setLoadCustomGroup:(NSDictionary<NSString *, NSString *> *)customGroupRules;

// 广告对象级广告源过滤器
- (void)addFilter:(WindMillAdFilter *)filter;

// 移除广告源过滤器
- (void)removeFilter;

/// 此功能需联系运营开通权限
/// 设置异常关闭检测的安全返回页面类名列表
/// @param classNames 栈顶 ViewController 的类名字符串数组，例如 @[@"MainHomeViewController", @"GameRootVC"]
/// @note 当发生异常场景导致广告未正常关闭时，
///       若 SDK 检测到当前 topViewController 的类名匹配此列表中的任一项，
///       则认为广告已不可见，将执行异常兜底逻辑：补发 close 回调并清理资源。
/// @note 建议在 loadAdData 前设置。
- (void)setSafeReturnViewControllerClassNames:(NSArray<NSString *> *)classNames;

@end

NS_ASSUME_NONNULL_END
