#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>
#import "TQWebViewConfig.h"
#import "TQSignCallbacks.h"
#import "TQSchemeInterceptor.h"

@class TQDownloadManager;

NS_ASSUME_NONNULL_BEGIN

/// SDK 内置 ``WKNavigationDelegate``。
///
/// **拦截优先级**:
/// 1. `qianapp://` → ``TQSchemeInterceptor`` 解析 → 回调 + cancel
/// 2. `http(s)://` → 默认导航(allow)
/// 3. `externalSchemes` 白名单 → `[UIApplication openURL:]` → cancel
/// 4. 未知 scheme → 丢弃 + `schemeNotMatched` 事件
///
/// **下载处理**(统一 URLSession + Cookie 同步):
/// - `navigationAction.shouldPerformDownload`(iOS 14.5+) → cancel + URLSession 下载
/// - `navigationResponse` 不可渲染 / PDF / attachment → cancel + URLSession 下载
/// - 下载由 ``TQDownloadManager`` 接管(全版本统一路径)
///
/// **错误事件**:`didFailProvisionalNavigation` / `didFail` / 主框架 HTTP 错误(>=400)上报。
@interface TQNavigationDelegate : NSObject <WKNavigationDelegate>

- (instancetype)initWithConfig:(TQWebViewConfig *)config
              schemeInterceptor:(TQSchemeInterceptor *)schemeInterceptor
          externalSchemeHandler:(TQExternalSchemeHandler *)externalSchemeHandler
                        onEvent:(nullable TQOnEventBlock)onEvent;

/// 设置下载管理器
- (void)setDownloadManager:(nullable TQDownloadManager *)manager;

/// 绑定受控 ``WKWebView``(weak),用于 lifetime 范围内的白屏自检与恢复。
/// Configurator 把 webView 与 delegate 绑定后调用此方法,delegate 不会强引用 webView。
- (void)bindWebView:(WKWebView *)webView;

/// 主动检查并尝试从白屏中恢复。
///
/// **判定规则**:`webView.URL == nil` 或 `about:blank`,且非加载中 → 视为白屏,
/// 用最近一次 main frame `lastProvisionalURL` 重新发起 `loadRequest:`。
/// 已正常 loading 中或 URL 有效则跳过,保证幂等不会打断正常导航。
- (void)attemptBlankRecoveryIfNeeded;

@end

NS_ASSUME_NONNULL_END
