/**
 * 通用预加载素材描述。
 *
 * 仅支持 `image` 与 `font`——微信 `wx.preloadAssets` 目前只支持这两类，
 * **不支持视频**（视频无法通过该 API 预热，转场视频仅能预热其封面图）。
 */
export type PreloadAsset = { type: 'image' | 'font'; src: string };

/** 判断当前是否为微信小程序环境。 */
const isWeapp = (): boolean => process.env.TARO_ENV === 'weapp';

/**
 * 通用预加载方法：图片、字体统一走 `wx.preloadAssets` 为视图层预热媒体资源。
 *
 * ## 特性
 * - 仅在微信小程序环境执行；非 weapp / 低版本（无 `wx.preloadAssets`）静默跳过。
 * - image / font 合批调用一次 `wx.preloadAssets`，组件仍用同一 CDN URL，命中缓存即秒开。
 * - **预加载失败不报错**：整体 try/catch + `fail` 空回调兜底。
 *
 * 参考：https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/wx.preloadAssets.html
 * （基础库 2.22.1+ 支持，功能描述：为视图层预加载媒体资源文件，目前支持 font、image）
 *
 * @param assets 待预加载素材列表
 */
export const preloadAssets = (assets: PreloadAsset[]): void => {
  try {
    if (!isWeapp() || !Array.isArray(assets) || assets.length === 0) {
      return;
    }
    // @ts-ignore 微信基础库 2.22.1+ 能力，低版本走 typeof 兜底跳过
    if (typeof wx === 'undefined' || typeof wx.preloadAssets !== 'function') {
      return;
    }

    const data = assets
      .filter((asset) => asset && asset.src && (asset.type === 'image' || asset.type === 'font'))
      .map((asset) => ({ type: asset.type, src: asset.src }));

    if (data.length === 0) {
      return;
    }

    // @ts-ignore
    wx.preloadAssets({
      data,
      fail: () => { /* 预加载失败不报错，静默忽略 */ },
    });
  } catch (e) {
    console.error('[preloadAssets] 预加载素材异常：', e);
    // 兜底：绝不抛出
  }
};

export default preloadAssets;
