// commpents/match-achieve/eliminate.js
Component({
    /**
     * 组件的属性列表
     */
    properties: {
        riseList: {
            type: Array,
            observer: function (val) {
                const data = this.computedTreeData();
                this.setData({ data })
            }
        },// 每组选取前x名的一维数字数组
        arrangeList: { type: Array }
    },

    /**
     * 组件的初始数据
     */
    data: {
        data: [],
    },

    /**
     * 组件的方法列表
     */
    methods: {
        // 计算晋级图
        computedTreeData() {
            const getWinnerNumList = this.properties.riseList; // 将每个小组取多少人收到1个纯数字的数组中
            const getWinnerNum = getWinnerNumList.reduce((p, n) => p + n, 0); // 小组赛选取人数: 应该是该比赛项目的 各组选取人数加和
            let level = 1;
            let loop = true;
            while (loop) {
                const needUserNum = 2 ** (level - 1);
                // 相等,说明已经计算出结果
                if (needUserNum === getWinnerNum) loop = false;
                // 小于,说明还可以继续往后计算
                else if (needUserNum < getWinnerNum) level++;
                else {
                    // 大于,说明不符合淘汰赛安排,需要手动定位
                    loop = false;
                    level = NaN
                }
            }
            if (!level) {
                console.log('不继续,返回了,编不了数据')
                return;
            }
            const levelList = [];
            // 1:16;2:8;3:4;4:2
            for (let i = 0; i < level - 1; i++) {
                const t = level - i - 1;
                // 计算:该层的位置数量
                const number = 2 ** t;
                const arr = [];
                for (let j = 1; j <= number; j++) {
                    const obj = { id: `${i}-${j}`, num: `${i}-${j}`, pos: [i, j] }
                    arr.push(obj);
                }
                levelList.push(arr)
            }
            // 进行数据组合,从最少的入手,依次取回,然后将取出来的数据删除掉
            let getLevelIndex = levelList.length - 1;
            const data = this.resetData(levelList, getLevelIndex)
            let obj = { id: `${levelList.length}`, num: `${levelList.length}`, children: data }
            return obj;
        },
        resetData(dataList, index = 0) {
            const thisLevelList = dataList[index]
            // 取出2条数据
            const p1 = thisLevelList[0]
            const p2 = thisLevelList[1]
            // 删除取出的2条数据
            dataList[index].shift()
            dataList[index].shift()
            if (index - 1 < 0) return [p1, p2]
            const p1c = this.resetData(dataList, index - 1)
            const p2c = this.resetData(dataList, index - 1)
            p1.children = p1c
            p2.children = p2c;
            return [p1, p2]
        },
    }
})
