#import <Foundation/Foundation.h>
#if __has_include(<TencentQianWebView/TQPrewarmLevel.h>)
#import <TencentQianWebView/TQPrewarmLevel.h>
#import <TencentQianWebView/TQPrewarmEnvironment.h>
#import <TencentQianWebView/TQPrewarmConfig.h>
#else
#import "TQPrewarmLevel.h"
#import "TQPrewarmEnvironment.h"
#import "TQPrewarmConfig.h"
#endif

NS_ASSUME_NONNULL_BEGIN

/// **WebView 预热统一入口**（三端对齐）。
///
/// 网络预热（L1 DNS / L4 warmup.html）省网络加载时间；实例池省 WKWebView 创建时间
/// （复用共享 WKProcessPool + defaultDataStore）。iOS 不做 L2/L3 轻量方案（Non-goal），
/// 连接与资源全靠 L4；因共享 defaultDataStore，warmup 磁盘缓存可被真实页跨实例复用。
///
/// **典型用法**：
/// ```objc
/// TQPrewarmConfig *cfg = [TQPrewarmConfig defaultConfig];
/// cfg.environment = TQPrewarmEnvironmentBeta;
/// [TQWebViewPrewarmer configure:cfg];
/// [TQWebViewPrewarmer prewarm:TQPrewarmLevelMinimal bizType:nil];
/// [TQWebViewPrewarmer prewarm:TQPrewarmLevelHeavy bizType:@"single-sign"];
/// ```
///
/// **跨端等价**：Swift / Android / HarmonyOS `TencentQianWebViewPrewarmer`。
/// 注：OC `release` 为保留语义，回收方法命名为 `releasePooled` / `releaseAll`。
@interface TQWebViewPrewarmer : NSObject

/// 全局配置。App 启动时调用；触发 manifest 后台异步拉取（不阻塞）。`config` 传 nil 用默认。
+ (void)configure:(nullable TQPrewarmConfig *)config;

/// 按意图档位触发预热，可多次调用（内部单调去重）。
/// `bizType`：Minimal 可传 nil，Light/Heavy 必填。
+ (void)prewarm:(TQPrewarmLevel)level bizType:(nullable NSString *)bizType;

/// 释放池实例。
+ (void)releasePooled;

/// 释放所有预热资源并重置去重状态。
+ (void)releaseAll;

/// open(url) 环境错配检测（best-effort，仅告警）。仅命中 3 个已知 quick.* 环境之一
/// 且与配置不符才 log 警告；非 quick 域名不告警。
+ (void)warnIfEnvironmentMismatch:(nullable NSString *)url;

/// 一次性获取 manifest 中的 bizType 列表。
/// - manifest 已缓存 → 立即回调；拉取中 → 排队完成后回调一次；失败 → 不回调。
/// - 未调用 configure 时会以默认配置懒初始化，避免 callback 滞留。
+ (void)getMenuBizTypes:(void (^)(NSArray<NSString *> *bizTypes))callback;

/// 各环境内置 manifest URL 映射（测试可见）。
+ (NSString *)manifestUrlForEnvironment:(TQPrewarmEnvironment)env;

/// 反查某 URL 属于哪个已知环境；非 3 个已知 quick.* 返回 nil（测试可见）。
+ (nullable NSNumber *)environmentForURL:(nullable NSString *)url;

/// 将语言偏好拼进 warmup.html URL（?lang=，warmup.html 内优先级最高）；空则原样返回（测试可见）。
+ (NSString *)appendLang:(NSString *)url lang:(nullable NSString *)lang;

@end

NS_ASSUME_NONNULL_END
