class Roll {
    constructor() {
        this._ = []; // 存储要roll的列表
        this.totalRank = 0; // 总权重
    }

    add(
        item = throwError('Item must be required'), // 验证参数
        rank = throwError('Rank must be required') // 验证参数
    ) {
        const rankType = typeof rank;
        if (rankType !== 'number')
            throwError(`Rank must be a Number not ${rankType}`);
        if (rank <= 0) throwError('require Rank>0');
        this._.push({
            item,
            rank
        }); // 把要roll的商品添加要列表中
        this.totalRank += rank // 更新权重
    }

    roll() {
        let totalRank = this.totalRank;

        const random = cc.random0To1(); // 产生一个随机数

        let result = null;

        let start = 0; // 区间的开始，第一个是为0

        for (let item of this._) {
            const end = start + item.rank / totalRank; // 计算区间的结束
            if (random > start && random <= end) { // 如果随机数在这个区间内，说明抽中了该商品，终止循环
                result = item;
                break;
            }
            start = end; // 当前区间的结束，作为下一个区间的开始
        }
        return result ? result.item : null;
    }
}

module.exports = Roll;