/**
 * Utils - 通用工具函数
 */

/**
 * 生成指定范围的随机整数
 * @param {number} min - 最小值（包含）
 * @param {number} max - 最大值（包含）
 * @returns {number}
 */
function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

/**
 * 生成指定长度的随机数字字符串
 * @param {number} length - 长度
 * @returns {string}
 */
function randomDigits(length) {
  let result = '';
  for (let i = 0; i < length; i++) {
    result += randomInt(0, 9);
  }
  return result;
}

/**
 * 将数字填充为指定长度的字符串
 * @param {number} num - 数字
 * @param {number} length - 目标长度
 * @returns {string}
 */
function padZero(num, length = 2) {
  return String(num).padStart(length, '0');
}

/**
 * Luhn算法校验（信用卡号校验）
 * @param {string} cardNumber - 卡号
 * @returns {boolean}
 */
function luhnCheck(cardNumber) {
  let sum = 0;
  let isEven = false;

  // 从右向左遍历
  for (let i = cardNumber.length - 1; i >= 0; i--) {
    let digit = parseInt(cardNumber[i]);

    if (isEven) {
      digit *= 2;
      if (digit > 9) {
        digit -= 9;
      }
    }

    sum += digit;
    isEven = !isEven;
  }

  return sum % 10 === 0;
}

/**
 * 生成符合Luhn算法的卡号
 * @param {string} prefix - 卡号前缀
 * @param {number} totalLength - 总长度
 * @returns {string}
 */
function generateLuhnNumber(prefix, totalLength) {
  // 生成除最后一位外的随机数字
  const remaining = totalLength - prefix.length - 1;
  let cardNumber = prefix + randomDigits(remaining);

  // 计算校验位
  let sum = 0;
  let isEven = true;

  for (let i = cardNumber.length - 1; i >= 0; i--) {
    let digit = parseInt(cardNumber[i]);

    if (isEven) {
      digit *= 2;
      if (digit > 9) {
        digit -= 9;
      }
    }

    sum += digit;
    isEven = !isEven;
  }

  const checkDigit = (10 - (sum % 10)) % 10;
  return cardNumber + checkDigit;
}

module.exports = {
  randomInt,
  randomDigits,
  padZero,
  luhnCheck,
  generateLuhnNumber
};
