import { isNumber } from 'lodash-es';
/**
 * 格式化数字，保留 count 位小数，小数不足 count 位时低位补 0，多余的小数则四舍五入
 * @param num
 * @param count
 * @returns 如果 num 不是数字则原样返回，否则返回处理后的字符串
 */
export const toFixed = (num: number, count: number) => {
    if (!isNumber(num)) return num;
    return num.toFixed(count);
};

/**
 * 格式化数字，最多保留 limit 位小数，多余的小数四舍五入
 * @param num
 * @param limit
 * @returns 如果 num 不是数字则原样返回，否则返回处理后的字符串
 */
export const toFixedLimit = (num: number, limit: number) => {
    if (!isNumber(num)) return num;
    return num
        .toFixed(limit)
        .replace(/(\.\d*?)0+$/, '$1')
        .replace(/\.$/, '');
};

/**
 * 格式化数字，保留 count 位小数，小数不足 count 位时低位补 0，多余的小数则直接丢弃，不进行四舍五入
 * @param num
 * @param count
 * @returns 如果 num 不是数字则原样返回，否则返回处理后的字符串
 */
export const toTruncate = (num: number, count: number) => {
    if (!isNumber(num)) return num;
    const factor = Math.pow(10, count);
    const truncated = Math.trunc(num * factor) / factor;
    return truncated.toFixed(count);
};

/**
 * 格式化数字，最多保留 limit 位小数，多余的小数直接丢弃，不进行四舍五入
 * @param num
 * @param count
 * @returns 如果 num 不是数字则原样返回，否则返回处理后的字符串
 */
export const toTruncateLimit = (num: number, limit: number) => {
    if (!isNumber(num)) return num;
    const factor = Math.pow(10, limit);
    const truncated = Math.trunc(num * factor) / factor;
    return truncated.toString();
};

/**
 * 格式化数字，添加千位分隔符，保留 count 位小数，小数不足 count 位时低位补 0，多余的小数则四舍五入
 * @param num
 * @param count
 * @returns 如果 num 不是数字则原样返回，否则返回处理后的字符串
 */
export const toCommaFixed = (num: number, count: number) => {
    if (!isNumber(num)) return num;
    const fixedNum = num.toFixed(count);
    const [i, d] = fixedNum.split('.');
    const integerPart = i.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    return `${integerPart}.${d}`;
};

/**
 * 格式化数字，添加千位分隔符，最多保留 limit 位小数，多余的小数四舍五入
 * @param num
 * @param limit
 * @returns 如果 num 不是数字则原样返回，否则返回处理后的字符串
 */
export const toCommaFixedLimit = (num: number, limit: number) => {
    if (!isNumber(num)) return num;
    const fixedNum = num
        .toFixed(limit)
        .replace(/(\.\d*?)0+$/, '$1')
        .replace(/\.$/, '');
    const [i, d] = fixedNum.split('.');
    const integerPart = i.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    const decimalPart = d ? `.${d}` : '';
    return integerPart + decimalPart;
};

/**
 * 格式化数字，添加千位分隔符，保留 count 位小数，小数不足 count 位时低位补 0，多余的小数则直接丢弃，不进行四舍五入
 * @param num
 * @param count
 * @returns 如果 num 不是数字则原样返回，否则返回处理后的字符串
 */
export const toCommaTruncate = (num: number, count: number) => {
    if (!isNumber(num)) return num;
    const factor = Math.pow(10, count);
    const truncated = Math.trunc(num * factor) / factor;
    const [i, d] = truncated.toFixed(count).split('.');
    const integerPart = i.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    return `${integerPart}.${d}`;
};

/**
 * 格式化数字，添加千位分隔符，最多保留 limit 位小数，多余的小数直接丢弃，不进行四舍五入
 * @param num
 * @param limit
 * @returns 如果 num 不是数字则原样返回，否则返回处理后的字符串
 */
export const toCommaTruncateLimit = (num: number, limit: number) => {
    if (!isNumber(num)) return num;
    const factor = Math.pow(10, limit);
    const truncated = Math.trunc(num * factor) / factor;
    const [i, d] = truncated.toString().split('.');
    const integerPart = i.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    const decimalPart = d ? `.${d}` : '';
    return integerPart + decimalPart;
};

/**
 * 格式化百分比
 * @param rate 百分比数值，范围为 0-1
 * @param decimalPlaces 保留的小数位数
 * @returns
 */
export const formatPercentage = (rate: number | undefined, decimalPlaces: number) => {
    if (!rate) return 0;
    return (rate * 100).toFixed(decimalPlaces);
};
