//
//  GDTHMAdapterDefine.h
//  HMAdsDemo
//
//  Created by Zhuanz on 2026/1/7.
//


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

// 预处理判断SDK是否存在
#if __has_include (<GDTMobSDK/GDTMobSDK.h>)

#import <GDTMobSDK/GDTMobSDK.h>

#else


@interface GDTSDKConfig : NSObject

+ (BOOL)initWithAppId:(NSString *)appId;
+ (void)startWithCompletionHandler:(void(^)(BOOL success, NSError *error))handler;
+ (void)forbiddenIDFA:(BOOL)forbiddened;
+ (NSString *)sdkVersion;

@end



#pragma mark -- 横幅广告
@protocol GDTUnifiedBannerViewDelegate <NSObject>

@end


// 批量声明所有你用到的空类（包含所有属性/方法）
@interface GDTUnifiedBannerView : UIView

@property (nonatomic, weak) id<GDTUnifiedBannerViewDelegate> delegate;

/**
 *  Banner展现和轮播时的动画效果开关，默认打开
 */
@property (nonatomic) BOOL animated;

/**
 *  广告刷新间隔，范围 [30, 120] 秒，默认值 30 秒。设 0 则不刷新。 [可选]
 */
@property (nonatomic) int autoSwitchInterval;

/**
 *  广告是否有效，以下情况会返回NO，建议在展示广告之前判断，否则会影响计费或展示失败
 *  a.广告未拉取成功
 *  b.广告过期
 */
@property (nonatomic, readonly) BOOL isAdValid;

/**
 *  构造方法
 *  详解：placementId - 广告位 ID
 *       viewController - 视图控制器
 */
- (instancetype)initWithPlacementId:(NSString *)placementId
                     viewController:(UIViewController *)viewController;

/**
 *  构造方法
 *  详解：frame - banner 展示的位置和大小
 *       placementId - 广告位 ID
 *       viewController - 视图控制器
 */
- (instancetype)initWithFrame:(CGRect)frame
                  placementId:(NSString *)placementId
               viewController:(UIViewController *)viewController;

/**
 *  构造方法, S2S bidding 后获取到 token 再调用此方法
 *  @param placementId  广告位 ID
 *  @param token  通过 Server Bidding 请求回来的 token
 *  @param viewController 视图控制器
 */
- (instancetype)initWithPlacementId:(NSString *)placementId
                              token:(NSString *)token
                     viewController:(UIViewController *)viewController;

/**
 *  S2S bidding 竞胜之后调用, 需要在调用广告 show 之前调用
 *  @param eCPM - 曝光扣费, 单位分，若优量汇竞胜，在广告曝光时回传，必传
 *  针对本次曝光的媒体期望扣费，常用扣费逻辑包括一价扣费与二价扣费，当采用一价扣费时，胜者出价即为本次扣费价格；当采用二价扣费时，第二名出价为本次扣费价格.
 */
- (void)setBidECPM:(NSInteger)eCPM;

/**
 *  拉取并展示广告
 */
- (void)loadAdAndShow;

/**
 返回广告的eCPM，单位：分
 
 @return 成功返回一个大于等于0的值，-1表示无权限或后台出现异常
 */
- (NSInteger)eCPM;
@end



#pragma mark -- 原生广告
@protocol GDTNativeExpressAdDelegete <NSObject>

@end


@interface GDTNativeExpressAd : NSObject

@property (nonatomic, weak) id<GDTNativeExpressAdDelegete> delegate;

@property (nonatomic, assign) BOOL videoAutoPlayOnWWAN;

/**
 *  自动播放时，是否静音。默认 YES。loadAd 前设置。
 */
@property (nonatomic, assign) BOOL videoMuted;

/**
 请求视频的时长下限。
 以下两种情况会使用 0，1:不设置  2:minVideoDuration大于maxVideoDuration
*/
@property (nonatomic) NSInteger minVideoDuration;

/**
 请求视频的时长上限，视频时长有效值范围为[5,180]。
 */
@property (nonatomic) NSInteger maxVideoDuration;

@property (nonatomic, readonly) NSString *placementId;

/**
 *  构造方法
 *  详解：placementId - 广告位 ID
 *       adSize - 广告展示的宽高
 */

- (instancetype)initWithPlacementId:(NSString *)placementId adSize:(CGSize)size;

/**
 *  拉取广告
 *  @param count 请求广告数量
 */
- (void)loadAd:(NSInteger)count;


@end


@interface GDTNativeExpressAdView : UIView

/**
 * 是否渲染完毕
 */
@property (nonatomic, assign, readonly) BOOL isReady;

/**
 * 是否是视频模板广告
 */
@property (nonatomic, assign, readonly) BOOL isVideoAd;

/**
 *  viewControllerForPresentingModalView
 *  详解：[必选]开发者需传入用来弹出目标页的ViewController，一般为当前ViewController
 */
@property (nonatomic, weak) UIViewController *controller;

/**
 *  广告是否有效，以下情况会返回NO，建议在调用render之前判断，当为NO时render失败
 *  a.广告过期
 */
@property (nonatomic, readonly) BOOL isAdValid;

/**
 *[必选]
 *原生模板广告渲染
 */
- (void)render;

/**
 * 视频模板广告时长，单位 ms
 */
- (CGFloat)videoDuration;

/**
 * 视频模板广告已播放时长，单位 ms
 */
- (CGFloat)videoPlayTime;

/**
 返回广告的eCPM，单位：分
 
 @return 成功返回一个大于等于0的值，-1表示无权限或后台出现异常
 */
- (NSInteger)eCPM;

/**
 返回广告的eCPM等级
 
 @return 成功返回一个包含数字的string，@""或nil表示无权限或后台异常
 */
- (NSString *)eCPMLevel;

/**
 *  S2S bidding 竞胜之后调用, 需要在调用广告 show 之前调用
 *  @param eCPM - 曝光扣费, 单位分，若优量汇竞胜，在广告曝光时回传，必传
 *  针对本次曝光的媒体期望扣费，常用扣费逻辑包括一价扣费与二价扣费，当采用一价扣费时，胜者出价即为本次扣费价格；当采用二价扣费时，第二名出价为本次扣费价格.
 */
- (void)setBidECPM:(NSInteger)eCPM;

@end







#pragma mark -- 插屏广告
@protocol GDTUnifiedInterstitialAdDelegate<NSObject>

@end


@interface GDTUnifiedInterstitialAd : NSObject

@property (nonatomic, readonly) BOOL isAdValid;

/**
 *  委托对象
 */
@property (nonatomic, weak) id<GDTUnifiedInterstitialAdDelegate> delegate;

@property (nonatomic, readonly) NSString *placementId;
/**
 *  构造方法
 *  详解：placementId - 广告位 ID
 */
- (instancetype)initWithPlacementId:(NSString *)placementId;

/**
 *  构造方法, S2S bidding 后获取到 token 再调用此方法
 *  @param placementId  广告位 ID
 *  @param token  通过 Server Bidding 请求回来的 token
 */
- (instancetype)initWithPlacementId:(NSString *)placementId token:(NSString *)token;

/**
 *  S2S bidding 竞胜之后调用, 需要在调用广告 show 之前调用
 *  @param eCPM - 曝光扣费, 单位分，若优量汇竞胜，在广告曝光时回传，必传
 *  针对本次曝光的媒体期望扣费，常用扣费逻辑包括一价扣费与二价扣费，当采用一价扣费时，胜者出价即为本次扣费价格；当采用二价扣费时，第二名出价为本次扣费价格.
 */
- (void)setBidECPM:(NSInteger)eCPM;

/**
 *  广告发起请求方法
 *  详解：[必选]发起拉取广告请求
 */
- (void)loadAd;

/**
*  插屏全屏视频广告发起请求方法
*  详解：[必选]发起拉取广告请求
*/
- (void)loadFullScreenAd;


/**
 *  广告展示方法
 *  详解：[必选]发起展示广告请求, 必须传入用于显示插播广告的UIViewController
 */

- (void)presentAdFromRootViewController:(UIViewController *)rootViewController;

/**
*  插屏视频全屏广告展示方法
*  详解：[必选]发起展示广告请求, 必须传入用于显示插播广告的UIViewController
*/
- (void)presentFullScreenAdFromRootViewController:(UIViewController *)rootViewController;

/**
 返回广告的eCPM，单位：分

 @return 成功返回一个大于等于0的值，-1表示无权限或后台出现异常
 */
- (NSInteger)eCPM;

/**
 返回广告的eCPM等级
 
 @return 成功返回一个包含数字的string，@""或nil表示无权限或后台异常
 */
- (NSString *)eCPMLevel;

/**
 *  非 WiFi 网络，是否自动播放。默认 YES。loadAd 前设置。
 */

@property (nonatomic, assign) BOOL videoAutoPlayOnWWAN;

/**
 *  自动播放时，是否静音。默认 YES。loadAd 前设置。
 */
@property (nonatomic, assign) BOOL videoMuted;

/**
 请求视频的时长下限，插屏激励广告位设置此属性不生效
 以下两种情况会使用 0，1:不设置  2:minVideoDuration大于maxVideoDuration
*/
@property (nonatomic) NSInteger minVideoDuration;

/**
 请求视频的时长上限，视频时长有效值范围为[5,180]，插屏激励广告位设置此属性不生效
 */
@property (nonatomic) NSInteger maxVideoDuration;

/**
 * 是否是视频插屏2.0广告
 */
@property (nonatomic, assign, readonly) BOOL isVideoAd;

/**
 * 视频插屏2.0广告时长，单位 ms
 */
- (CGFloat)videoDuration;

/**
 * 视频插屏广告已播放时长，单位 ms
 */
- (CGFloat)videoPlayTime;

@end





#pragma mark -- 激励视频广告
@protocol GDTRewardedVideoAdDelegate<NSObject>

@end



@interface GDTRewardVideoAd : NSObject

@property (nonatomic, getter=isAdValid, readonly) BOOL adValid;
@property (nonatomic) BOOL videoMuted;
@property (nonatomic, assign, readonly) NSInteger expiredTimestamp;
@property (nonatomic, weak) id <GDTRewardedVideoAdDelegate> delegate;
@property (nonatomic, readonly) NSString *placementId;

/**
构造方法

@param placementId - 广告位 ID
@return GDTRewardVideoAd 实例
*/
- (instancetype)initWithPlacementId:(NSString *)placementId;

/**
*  构造方法, S2S bidding 后获取到 token 再调用此方法
*  @param placementId  广告位 ID
*  @param token  通过 Server Bidding 请求回来的 token
*/
- (instancetype)initWithPlacementId:(NSString *)placementId token:(NSString *)token;

/**
*  S2S bidding 竞胜之后调用, 需要在调用广告 show 之前调用
*  @param eCPM - 曝光扣费, 单位分，若优量汇竞胜，在广告曝光时回传，必传
*  针对本次曝光的媒体期望扣费，常用扣费逻辑包括一价扣费与二价扣费，当采用一价扣费时，胜者出价即为本次扣费价格；当采用二价扣费时，第二名出价为本次扣费价格.
*/
- (void)setBidECPM:(NSInteger)eCPM;

/**
加载广告方法 支持 iOS8.1 及以上系统
*/
- (void)loadAd;
/**
展示广告方法

@param rootViewController 用于 present 激励视频 VC
@return 是否展示成功
*/
- (BOOL)showAdFromRootViewController:(UIViewController *)rootViewController;

/**
返回广告的eCPM，单位：分

@return 成功返回一个大于等于0的值，-1表示无权限或后台出现异常
*/
- (NSInteger)eCPM;

/**
返回广告的eCPM等级

@return 成功返回一个包含数字的string，@""或nil表示无权限或后台异常
*/
- (NSString *)eCPMLevel;

@end



#pragma mark -- 开屏广告
@protocol GDTSplashAdDelegate<NSObject>

@end


@interface GDTSplashAd : NSObject


@property (nonatomic, weak) id<GDTSplashAdDelegate> delegate;

/**
*  拉取广告超时时间，默认为5秒
*  详解：拉取广告超时时间，开发者调用loadAd方法以后会立即展示backgroundImage，然后在该超时时间内，如果广告拉
*  取成功，则立马展示开屏广告，否则放弃此次广告展示机会。
*/
@property (nonatomic, assign) CGFloat fetchDelay;

/**
*  开屏广告的背景图片
*  可以设置背景图片作为开屏加载时的默认背景
*/
@property (nonatomic, strong) UIImage *backgroundImage;

/**
*  开屏广告的背景色
*  可以设置开屏图片来作为开屏加载时的默认图片
*/
@property (nonatomic, copy) UIColor *backgroundColor;

/**
* 跳过按钮的位置
*/
@property (nonatomic, assign) CGPoint skipButtonCenter;

/**
* 是否需要开屏V+功能
*/
@property (nonatomic, assign) BOOL needZoomOut;

/**
返回广告平台名称

@return 当使用流量分配功能时，用于区分广告平台；未使用时为空字符串
*/
- (NSString *)adNetworkName;

/**
返回广告的eCPM，单位：分

@return 成功返回一个大于等于0的值，-1表示无权限或后台出现异常
*/
- (NSInteger)eCPM;

/**
返回广告的eCPM等级

@return 成功返回一个包含数字的string，@""或nil表示无权限或后台异常
*/
- (NSString *)eCPMLevel;

/**
*  构造方法
*  详解：placementId - 广告位 ID
*/
- (instancetype)initWithPlacementId:(NSString *)placementId;

/**
*  构造方法, S2S bidding 后获取到 token 再调用此方法
*  @param placementId  广告位 ID
*  @param token  通过 Server Bidding 请求回来的 token
*/
- (instancetype)initWithPlacementId:(NSString *)placementId token:(NSString *)token;

/**
*  S2S bidding 竞胜之后调用, 需要在调用广告 show 之前调用
*  @param eCPM - 曝光扣费, 单位分，若优量汇竞胜，在广告曝光时回传，必传
*  针对本次曝光的媒体期望扣费，常用扣费逻辑包括一价扣费与二价扣费，当采用一价扣费时，胜者出价即为本次扣费价格；当采用二价扣费时，第二名出价为本次扣费价格.
*/
- (void)setBidECPM:(NSInteger)eCPM;

/**
预加载闪屏广告接口

@param placementId 广告位ID
*/
- (void)preloadSplashOrderWithPlacementId:(NSString *)placementId;

#pragma mark - Parallel method

/**
* 返回广告是否可展示
* 对于并行请求，在调用showAdInWindow前时需判断下
* @return 当广告已经加载完成&&未曝光&&未过期时，为YES，否则为NO
*/
- (BOOL)isAdValid;

/**
*  发起拉取广告请求，只拉取不展示
*  详解：广告素材及广告图片拉取成功后会回调splashAdDidLoad方法，当拉取失败时会回调splashAdFailToPresent方法
*/
- (void)loadAd;

/**
*  展示广告，调用此方法前需调用isAdValid方法判断广告素材是否有效
*  详解：广告展示成功时会回调splashAdSuccessPresentScreen方法，展示失败时会回调splashAdFailToPresent方法
*/
- (void)showAdInWindow:(UIWindow *)window withBottomView:(UIView *)bottomView skipView:(UIView *)skipView;



@end






#endif

// 第三步：运行时真实判断宏（核心！替代预编译宏）
#define GDTAdCanUse_HMAds() ([GDTSDKConfig class])


