// 这里放置一些公共的工具函数

import {md5_hex} from './md5';

/**
 * @description: 比较两个版本号的大小。比如 6.0 和 7.3.1
 * @param v1
 * @param v2
 * @return 如果 v1 更大，返回 1；如果 v2 更大，返回 -1；否则返回 0
 */
const compareVersions = (v1: string, v2: string): number => {
  const v1Parts = v1.split('.').map(Number);
  const v2Parts = v2.split('.').map(Number);

  for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
    const v1Part = v1Parts[i] || 0;
    const v2Part = v2Parts[i] || 0;

    if (v1Part > v2Part) {
      return 1;
    }
    if (v1Part < v2Part) {
      return -1;
    }
  }

  return 0;
};

// 暂时使用该防抖函数，之后要优化
const functionReqMap: Map<
  string,
  {
    startTime: number;
    wait: number;
  }
> = new Map();
// eslint-disable-next-line @typescript-eslint/ban-types
const debounce = (fun: Function, wait = 1500): void => {
  const funcValue1 = fun.toString();
  const hash = md5_hex(funcValue1);
  const startTime = Date.now();
  if (functionReqMap.get(hash)) {
    const funcValue = functionReqMap.get(hash);
    // 防止因为特殊原因没有移除map中该函数的记录，导致一直无法执行函数的问题
    if (funcValue && funcValue.startTime + funcValue.wait <= startTime) {
      functionReqMap.delete(hash);
    } else {
      return;
    }
  }
  functionReqMap.set(hash, {
    startTime: startTime,
    wait: wait,
  });
  // 执行函数调用
  fun();
  // 拦截在wait期间的函数再次调用，在超时后，将限制解除
  setTimeout(() => {
    const needRemoveKeys: string[] = [];
    functionReqMap.forEach((value, key, map) => {
      const curTime = Date.now();
      const funcValue = map.get(key);
      if (funcValue && funcValue.startTime + funcValue.wait <= curTime) {
        needRemoveKeys.push(key);
      }
    });
    needRemoveKeys.map(value => {
      functionReqMap.delete(value);
    });
  }, wait);
};

export {compareVersions, debounce};
