part of '../../core_app.dart';

/// `web_shell_core` 内部逻辑的测试入口。
@visibleForTesting
const shellCoreTestHooks = ShellCoreTestHooks();

/// 对私有实现的测试封装，避免把内部细节暴露成正式 API。
@visibleForTesting
class ShellCoreTestHooks {
  /// 创建 `web_shell_core` 的测试钩子封装。
  const ShellCoreTestHooks();

  /// 返回当前初始地址字符串。
  String get initialUrl => _initialUrl;

  /// 返回当前初始 URI。
  Uri get initialUri => _initialUri;

  /// 返回当前生效的首屏方向配置。
  List<DeviceOrientation> get preferredOrientations =>
      _shellPreferredOrientations;

  /// 返回当前环境中的初始地址配置。
  String? get configuredInitialUrl => _env.initialUrl;

  /// 返回当前环境中的首屏方向配置。
  List<DeviceOrientation>? get configuredPreferredOrientations =>
      _env.preferredOrientations;

  /// 返回当前生效的升级配置地址。
  String? get upgradeConfigUrl => ShellUpgradeService.instance._configUrl;

  /// 解析字符串格式的启动配置。
  ShellBootstrapConfig? parseBootstrapConfigString(String content) {
    return ShellBootstrapConfigService._parseConfigString(content);
  }

  /// 读取本地默认启动配置。
  Future<ShellBootstrapConfig?> loadDefaultBootstrapConfig(String assetPath) {
    return ShellBootstrapConfigService.loadDefaultConfig(assetPath);
  }

  /// 获取远程启动配置。
  Future<ShellBootstrapConfig?> fetchBootstrapConfig(String url) {
    return ShellBootstrapConfigService.fetchConfig(url);
  }

  /// 读取缓存中的启动配置。
  Future<ShellBootstrapConfig?> loadCachedBootstrapConfig() {
    return ShellBootstrapConfigService._loadFromCache();
  }

  /// 执行启动配置合并流程。
  Future<String?> applyBootstrapConfig() => _applyBootstrapConfig();

  /// 解析字符串格式的升级配置。
  ShellUpgradeConfig? parseUpgradeConfigString(String content) {
    return ShellUpgradeService.instance._parseConfigString(content);
  }

  /// 获取远程升级配置。
  Future<ShellUpgradeConfig?> fetchUpgradeConfig(String url) {
    return ShellUpgradeService.instance._fetchConfig(url);
  }

  /// 将升级配置转换为升级插件模型。
  AppUpgradeVersion? convertUpgradeConfig(ShellUpgradeConfig config) {
    return ShellUpgradeService.instance._convertToAppUpgradeVersion(config);
  }

  /// 执行升级配置到版本模型的异步解析闭包。
  Future<AppUpgradeVersion?> resolveUpgradeConfig(
    ShellUpgradeConfig config, {
    int upType = 1,
  }) {
    return ShellUpgradeService.instance._createVersionResolver(config)(upType);
  }

  /// 为测试设置升级配置地址。
  void setupUpgradeConfigUrl(String? url) {
    ShellUpgradeService.instance.setupConfigUrl(url);
  }

  /// 触发版本检查。
  Future<void> checkVersion(
    BuildContext context, {
    bool showNoUpdateToast = false,
  }) {
    return ShellUpgradeService.instance.checkVersion(
      context,
      showNoUpdateToast: showNoUpdateToast,
    );
  }

  /// 为测试初始化全局壳环境与初始地址。
  void initializeEnvironment(ShellEnvironment environment) {
    _env = environment;
    _initializeUrls();
  }

  /// 通过与运行时一致的代码路径进入沉浸式模式。
  Future<void> enterImmersiveMode() => _enterImmersiveMode();

  /// 判断哪些平台支持内嵌 WebView。
  bool supportsEmbeddedWebView({
    bool isWeb = false,
    TargetPlatform? platform,
  }) {
    return _supportsEmbeddedWebView(isWeb: isWeb, platform: platform);
  }

  /// 判断给定地址是否应视为网络地址。
  bool isNetworkUrl(String? url) => _isNetworkUrl(url);

  /// 将 URI 归一化为可比较的字符串形式。
  String normalizeComparableUri(Uri uri) => _normalizeComparableUri(uri);

  /// 返回指定 URI 协议对应的默认端口。
  int defaultPortForScheme(String scheme) => _defaultPortForScheme(scheme);

  /// 归一化路径，供 URI 比较使用。
  String normalizeComparablePath(String path) => _normalizeComparablePath(path);

  /// 返回桥接初始化脚本。
  String buildAppShellBridgeScript() => _buildAppShellBridgeScript();

  /// 返回旧相机兼容脚本。
  String get legacyCameraCompatScript => _legacyCameraCompatScript;

  /// 向当前页面注入桥接脚本。
  Future<void> injectAppShellBridge(WebViewController controller, String url) {
    return _injectAppShellBridge(controller, url);
  }

  /// 向当前页面发送桥接响应。
  Future<void> sendBridgeResponse(
    WebViewController controller, {
    required String requestId,
    required bool success,
    Object? data,
    String? error,
  }) {
    return _sendBridgeResponse(
      controller,
      requestId: requestId,
      success: success,
      data: data,
      error: error,
    );
  }

  /// 将 WebView 资源错误映射为面向用户的标题。
  String friendlyErrorTitle(WebResourceError error) {
    return _friendlyErrorTitle(error);
  }

  /// 将 WebView 资源错误映射为面向用户的提示文案。
  String friendlyErrorMessage(WebResourceError error) {
    return _friendlyErrorMessage(error);
  }

  /// 将选中的图片文件序列化为桥接负载格式。
  Future<List<Map<String, dynamic>>> serializeXFiles(
    List<XFile> files, {
    required String responseType,
  }) {
    return _serializeXFiles(files, responseType: responseType);
  }

  /// 将平台文件序列化为桥接负载格式。
  Future<List<Map<String, dynamic>>> serializePlatformFiles(
    List<PlatformFile> files, {
    required String responseType,
  }) {
    return _serializePlatformFiles(files, responseType: responseType);
  }

  /// 执行桥接与文件选择器共用的相机取图流程。
  Future<XFile?> pickCameraImage(
    ImagePicker imagePicker, {
    bool showPermissionAlert = false,
    WebViewController? controller,
  }) {
    return _pickCameraImage(
      imagePicker,
      showPermissionAlert: showPermissionAlert,
      controller: controller,
    );
  }

  /// 将选中的文件转换成 `file://` URI 字符串。
  List<String> xFilesToUriStrings(List<XFile> files) {
    return _xFilesToUriStrings(files);
  }

  /// 判断传入的 accept 列表是否允许图片。
  bool acceptsImages(List<String> acceptTypes) => _acceptsImages(acceptTypes);

  /// 判断传入的 accept 列表是否只允许图片。
  bool acceptsOnlyImages(List<String> acceptTypes) {
    return _acceptsOnlyImages(acceptTypes);
  }

  /// 判断单个 accept 标记是否应视为图片类型。
  bool isImageAcceptType(String acceptType) => _isImageAcceptType(acceptType);

  /// 根据文件名推断 MIME 类型。
  String guessMimeType(String fileName) => _guessMimeType(fileName);

  /// 在当前页面中显示网页弹窗。
  Future<void> showWebAlert(WebViewController controller, String message) {
    return _showWebAlert(controller, message);
  }

  /// 按桥接语义将动态值转换为布尔值。
  bool boolValue(Object? value, {bool defaultValue = false}) {
    return _boolValue(value, defaultValue: defaultValue);
  }

  /// 判断 URI 是否应继续留在内嵌 WebView 中。
  bool shouldStayInWebView(Uri uri) => _shouldStayInWebView(uri);

  /// 使用外部应用打开指定 URI。
  Future<bool> openExternalUri(Uri uri) => _openExternalUri(uri);

  /// 将逻辑权限类型映射为 `permission_handler` 中的权限对象。
  Permission? permissionForType(String type) => _permissionForType(type);

  /// 从版本名中解析 WebView 主版本号。
  int? parseWebViewMajorVersion(String? versionName) {
    return _parseWebViewMajorVersion(versionName);
  }

  /// 获取设备信息（桥接用）。
  Future<Map<String, dynamic>> getDeviceInfoFromBridge() {
    return _getDeviceInfoFromBridge();
  }

  /// 获取网络状态（桥接用）。
  Future<Map<String, dynamic>> getNetworkStatusFromBridge() {
    return _getNetworkStatusFromBridge();
  }

  /// 显示 Toast（桥接用）。
  void showToastFromBridge(BuildContext context, Map<String, dynamic> payload) {
    _showToastFromBridge(context, payload);
  }

  /// 设置状态栏样式（桥接用）。
  void setStatusBarFromBridge(Map<String, dynamic> payload) {
    _setStatusBarFromBridge(payload);
  }
}
