'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var _typeof = require('@babel/runtime/helpers/typeof');

function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

var _typeof__default = /*#__PURE__*/_interopDefaultLegacy(_typeof);

/**
/**
 * 处理图片尺寸单位，将 px/rem 转换为纯数字
 * @docgen
 * @function handleImgUnit
 *
 * @param {number|string} size - 输入的尺寸值
 * @return {number} 返回处理后的数值（px）
 *
 * @description
 * 该函数用于处理图片尺寸，去除单位（px/rem）并转换为数字类型。
 * - 纯数字：直接返回
 * - px 单位：去除 'px' 后返回数字
 * - rem 单位：乘以根元素的 fontSize 转换为 px 值
 *
 * @example
 *
 * handleImgUnit(3);        // 3
 * handleImgUnit('10');     // 10
 * handleImgUnit('30px');   // 30
 *
 * // 假设 document.documentElement.style.fontSize = '50px'
 * handleImgUnit('5rem');   // 250
 *
 * // 假设 document.documentElement.style.fontSize = '10px'
 * handleImgUnit('5rem');   // 50
 */
var handleImgUnit = function handleImgUnit(size) {
  if (!size || typeof size === 'number') {
    return size;
  }
  if (size.indexOf('px') === -1 && size.indexOf('rem') === -1) {
    return parseFloat(size);
  }
  if (size.indexOf('px') > -1) {
    return parseFloat(size.replace('px', ''));
  }
  var baseFontSize = 50;
  try {
    baseFontSize = parseFloat(document.documentElement.style.fontSize.replace('px', ''));
    if (isNaN(baseFontSize)) {
      baseFontSize = 50;
    }
  } catch (e) {
    console.log('err', e);
  }
  if (size.indexOf('rem') > -1) {
    return parseFloat(size.replace('rem', '')) * baseFontSize;
  }
};
var zhizhu = 'game.gtimg.cn';
var youtu = 'image.myqcloud.com';
var wxlogo = 'wx.qlogo.cn';
var thirdqq = 'thirdqq.qlogo.cn';
var thirdwx = 'thirdwx.qlogo.cn';
var qqlogo = 'q.qlogo.cn';
var ossweb = 'ossweb-img.qq.com';
var cdnMap = new Map([['igame-10037599.cos.ap-shanghai.myqcloud.com', 'igame-10037599.file.myqcloud.com'], ['image-1251917893.cos.ap-guangzhou.myqcloud.com', 'image-1251917893.file.myqcloud.com'], ['igame-10037599.image.myqcloud.com', 'igame-10037599.file.myqcloud.com'], ['gamelife-1251917893.cos.ap-guangzhou.myqcloud.com', 'gamelife-1251917893.igcdn.cn']]);
var isTencentPic = function isTencentPic(url) {
  return url && (url.indexOf(zhizhu) !== -1 || url.indexOf(youtu) !== -1 || url.indexOf(wxlogo) !== -1 || url.indexOf(thirdqq) !== -1 || url.indexOf(qqlogo) !== -1 || url.indexOf(thirdwx) !== -1 || url.indexOf(ossweb) !== -1);
};
var startWithHttp = function startWithHttp(url) {
  var http = /http:/;
  return http.test(url);
};
/**
 * 将图片地址由 http 替换为 https 协议
 * @param url 图片地址
 * @returns 新的地址
 * @example
 * ```ts
 * // 腾讯系图片域名才会被替换
 * getHttpsUrl('http://game.gtimg.cn/x.jpg');
 * // 'https://game.gtimg.cn/x.jpg'
 *
 * getHttpsUrl('http://wx.qlogo.cn/x.png');
 * // 'https://wx.qlogo.cn/x.png'
 *
 * // 非腾讯域名保持原样
 * getHttpsUrl('http://other.com/x.jpg');
 * // 'http://other.com/x.jpg'
 *
 * // 本身就是 https 不会变
 * getHttpsUrl('https://game.gtimg.cn/x.jpg');
 * // 'https://game.gtimg.cn/x.jpg'
 * ```
 */
var getHttpsUrl = function getHttpsUrl(inUrl) {
  var url = inUrl;
  if (startWithHttp(url) && isTencentPic(url)) {
    url = url.replace('http', 'https');
  }
  return url;
};
/**
 * 获取 cdn 链接
 * @param {string} url 图片地址
 * @returns 新的地址
 * @example
 * ```ts
 * // cos 域名会被替换为 cdn 加速域名
 * getCdnUrl('https://igame-10037599.cos.ap-shanghai.myqcloud.com/a.jpg');
 * // 'https://igame-10037599.file.myqcloud.com/a.jpg'
 *
 * getCdnUrl('https://gamelife-1251917893.cos.ap-guangzhou.myqcloud.com/b.png');
 * // 'https://gamelife-1251917893.igcdn.cn/b.png'
 *
 * // 非映射表中的域名保持原样
 * getCdnUrl('https://other.com/x.jpg');
 * // 'https://other.com/x.jpg'
 *
 * // 空字符串
 * getCdnUrl(''); // ''
 * ```
 */
function getCdnUrl() {
  var inUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  var url = inUrl;
  if (url) {
    var domainStr = url.split('/');
    if (domainStr && domainStr.length > 2) {
      var domain = domainStr[2];
      if (cdnMap.has(domain)) {
        url = url.replace(domain, cdnMap.get(domain));
      }
      return url;
    }
  } else {
    return url;
  }
  return '';
}
/**
 * 处理并压缩图片 URL
 * @docgen
 * @function getCompressImgUrl
 *
 * @param {string|object} inUrl - 图片原始 URL，或包含 url/width/height 的对象
 * @param {number} [inImageWidth=0] - 图片裁剪后的宽度（可选，默认为 0，表示不裁剪）
 * @param {number} [inImageHeight=0] - 图片裁剪后的高度（可选，默认为 0，表示不裁剪）
 * @return {string} 返回处理后的图片 URL
 *
 * @description
 * 该函数用于处理腾讯云 COS 图片，实现按需加载和压缩。
 * - 自动将 http 转为 https
 * - 对腾讯云图片添加压缩参数
 * - 自动调整图片尺寸为 2 倍（避免图片模糊）
 * - 宽高按 10 取整（避免图片闪烁）
 *
 * @example
 *
 * // 基础用法
 * const url = 'https://image-xxx.file.myqcloud.com/test.jpg';
 * const compressed = getCompressImgUrl(url, 100, 100);
 *
 * // 使用对象参数
 * const compressed2 = getCompressImgUrl({
 *   url: 'https://image-xxx.file.myqcloud.com/test.jpg',
 *   width: 100,
 *   height: 100
 * });
 */
function getCompressImgUrl() {
  var inUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  var inImageWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  var inImageHeight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  var _a;
  var url = inUrl;
  var imageWidth = inImageWidth;
  var imageHeight = inImageHeight;
  if (_typeof__default["default"](url) === 'object') {
    imageWidth = url.width ? url.width : 0;
    imageHeight = url.height ? url.height : 0;
    url = url.url ? url.url : '';
  }
  // 游戏内无法加载http，统一替换
  url = ((_a = url === null || url === void 0 ? void 0 : url.replace) === null || _a === void 0 ? void 0 : _a.call(url, 'http:', 'https:')) || '';
  url = getCompressTencentImgUrl(url, imageWidth, imageHeight);
  return url;
}
function getCompressTencentImgSize(imageWidth, imageHeight) {
  var width = 0;
  var height = 0;
  if (imageWidth && imageHeight) {
    width = imageWidth > 0 ? imageWidth * 2 : 0;
    height = imageHeight > 0 ? imageHeight * 2 : 0;
  }
  // width和height都按10取整，解决图片大小微微改变的时候，图片闪烁的问题
  width = formatInt(width, 1, true);
  height = formatInt(height, 1, true);
  // 有时候图片没设置长宽，导致图片100%时图片过大，选择宽度优先
  if (width > 200 && height > 200 && width === height) {
    height = 0;
  }
  if (width < 10 && height < 10) {
    width = 0;
    height = 0;
  }
  return {
    width: width,
    height: height
  };
}
function getCompressTencentImgUrl(url, imageWidth, imageHeight) {
  // 如果是腾讯云的图片实现按需加载（1倍的时候感觉图片有点糊，放大到2倍）
  var isCDN = Array.from(cdnMap.values()).some(function (item) {
    return url === null || url === void 0 ? void 0 : url.includes(item);
  });
  var isTencentCloudPic = url && isCDN && url.indexOf('?') === -1;
  if (!isTencentCloudPic) {
    return url;
  }
  var _getCompressTencentIm = getCompressTencentImgSize(imageWidth, imageHeight),
    width = _getCompressTencentIm.width,
    height = _getCompressTencentIm.height;
  if (width > 150 || height > 150) {
    url = "".concat(url, "?imageMogr2/format/yjpeg/quality/80/thumbnail/!").concat(width > 0 ? width.toString() : '', "x").concat(height > 0 ? height.toString() : '', "r");
  } else if (width > 0 || height > 0) {
    url = "".concat(url, "?imageMogr2/thumbnail/!").concat(width > 0 ? width.toString() : '', "x").concat(height > 0 ? height.toString() : '', "r");
  }
  return url;
}
var formatInt = function formatInt(num) {
  var prec = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
  var ceil = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  var len = String(num).length;
  if (len <= prec) {
    return num;
  }
  var mult = Math.pow(10, prec);
  return ceil ? Math.ceil(num / mult) * mult : Math.floor(num / mult) * mult;
};
/**
 * 处理图片 URL（换 CDN 域名 + 裁剪压缩）
 * @docgen
 * @function tinyImage
 *
 * @param {string} inUrl - 图片原始 URL
 * @param {number} [width=0] - 图片裁剪后的宽度（可选，默认为 0，表示不裁剪）
 * @param {number} [height=0] - 图片裁剪后的高度（可选，默认为 0，表示不裁剪）
 * @return {string} 返回处理后的图片 URL
 *
 * @description
 * 该函数是图片处理的综合方法，依次执行：
 * 1. 将 http 转为 https
 * 2. 替换为 CDN 域名
 * 3. 添加压缩和裁剪参数
 *
 * @example
 *
 * const url = 'http://igame-10037599.cos.ap-shanghai.myqcloud.com/test.jpg';
 * const optimized = tinyImage(url, 200, 200);
 * // 结果：https 域名 + CDN + 压缩参数
 */
var tinyImage = function tinyImage(inUrl) {
  var imageWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  var imageHeight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  var url = inUrl;
  url = getHttpsUrl(url);
  url = getCdnUrl(url);
  url = getCompressImgUrl(url, imageWidth, imageHeight);
  return url;
};
var supportsWebp = function supportsWebp(_ref) {
  var createImageBitmap = _ref.createImageBitmap,
    Image = _ref.Image;
  if (!createImageBitmap || !Image) return Promise.resolve(false);
  return new Promise(function (resolve) {
    // 加载一个1x1的空白图片，看下是否支持webP
    var image = new Image();
    image.onload = function () {
      createImageBitmap(image).then(function () {
        resolve(true);
      })["catch"](function () {
        resolve(false);
      });
    };
    image.onerror = function () {
      resolve(false);
    };
    image.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=';
  });
};
/**
 * 判断当前浏览器是否支持 webp
 * @returns {Promise<boolean> }是否支持
 * @example
 * ```ts
 * const checkWebp = isSupportedWebp();
 * const supported = await checkWebp();
 * if (supported) {
 *   console.log('当前浏览器支持 webp');
 * }
 *
 * // 连续调用会复用上次检测结果（memo 缓存）
 * await checkWebp(); // 不会重复创建 Image
 * ```
 */
var isSupportedWebp = function isSupportedWebp() {
  var memo = null;
  return function () {
    if (!memo) {
      memo = supportsWebp(window);
    }
    return memo;
  };
};

exports.getCdnUrl = getCdnUrl;
exports.getCompressImgUrl = getCompressImgUrl;
exports.getHttpsUrl = getHttpsUrl;
exports.handleImgUnit = handleImgUnit;
exports.isSupportedWebp = isSupportedWebp;
exports.tinyImage = tinyImage;
