// ignore_for_file: non_constant_identifier_names

import 'dart:async';

///公共帮助类
class CommonUtil {
  static const deFaultDurationTime = 300;
  static Timer? timer;

  // 邮箱判断
  static final String REGEX_EMAIL =
      "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}\$";

  // 纯数字
  static final String DIGIT_REGEX = "[0-9]+";

  // 含有数字
  static final String CONTAIN_DIGIT_REGEX = ".*[0-9].*";

  // 纯字母
  static final String LETTER_REGEX = "[a-zA-Z]+";

  // 包含字母
  static final String SMALL_CONTAIN_LETTER_REGEX = ".*[a-z].*";

  // 包含字母
  static final String BIG_CONTAIN_LETTER_REGEX = ".*[A-Z].*";

  // 包含字母
  static final String CONTAIN_LETTER_REGEX = ".*[a-zA-Z].*";

  // 纯中文
  static final String CHINESE_REGEX = "[\u4e00-\u9fa5]";

  // 空格
  static final String BLANK_SPACE = "[ ]";

  // 仅仅包含字母和数字
  static final String LETTER_DIGIT_REGEX = "^[a-z0-9A-Z]+\$";
  static final String CHINESE_LETTER_REGEX = "([\u4e00-\u9fa5]+|[a-zA-Z]+)";
  static final String CHINESE_LETTER_DIGIT_REGEX =
      "^[a-z0-9A-Z\u4e00-\u9fa5]+\$";

  /// 节流函数 处理规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效
  static const String deFaultThrottleId = 'DeFaultThrottleId';

  static Map<String, int> startTimeMap = {deFaultThrottleId: 0};

  /// 防抖函数 在函数需要频繁触发的情况时,只有足够空闲时间,才执行一次
  ///
  /// [doSomething] 处理方法
  ///
  /// [durationTime] 禁止点击的时间
  static debounce(Function doSomething, {durationTime = deFaultDurationTime}) {
    timer?.cancel();
    timer = new Timer(Duration(milliseconds: durationTime), () {
      doSomething.call();
      timer = null;
    });
  }

  // 含有数字
  static bool hasDigit(String input) {
    if (input.isEmpty) return false;
    return new RegExp(CONTAIN_DIGIT_REGEX).hasMatch(input);
  }

  // 是否包含中文
  static bool isChinese(String input) {
    if (input.isEmpty) return false;
    return new RegExp(CHINESE_REGEX).hasMatch(input);
  }

  // 纯数字
  static bool isOnly(String input) {
    if (input.isEmpty) return false;
    return new RegExp(DIGIT_REGEX).hasMatch(input);
  }

  static throttle(Function doSomething,
      {String throttleId = deFaultThrottleId,
      durationTime = deFaultDurationTime,
      Function? continueClick}) {
    int currentTime = DateTime.now().millisecondsSinceEpoch;
    if (currentTime - (startTimeMap[throttleId] ?? 0) > durationTime) {
      doSomething.call();
      startTimeMap[throttleId] = DateTime.now().millisecondsSinceEpoch;
    } else {
      continueClick?.call();
    }
  }

  /// 字节转换
  static String convertBytesToMegabytesOrGigabytes(int bytes) {
    double gb = bytes / (1024 * 1024 * 1024);
    if (gb >= 1) {
      return gb.toStringAsFixed(2) + ' GB';
    } else {
      double mb = bytes / (1024 * 1024);
      return mb.toStringAsFixed(2) + ' MB';
    }
  }
}
