package com.boco.nbd.wios.flow.util;

import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

/**
 * @author:cao hai
 * @date:2022/8/23 16:37
 * @version:V1.0
 * @description: 1、5个服务商 35% 25% 20% 15% 5%
 * 2、4个服务商 40% 30% 20% 10%
 * 3、3个服务商 40% 35% 25%
 * 2、2个服务商 60% 40%
 * @modify:
 */
@Slf4j
public class DispatchUtil {

    private static Random random = new Random();

    private static final Integer MAX_BOUND = 101;

    /**
     * @param supplier total:初版暂时不做总量比例控制
     * @return
     */
    public static Integer findSupplier(List<Integer> supplier) {
        if (CollUtil.isEmpty(supplier)) {
            return null;
        }
        if (supplier.size() == 1) {
            return supplier.get(0);
        }
        List<Prize> prizes = Prize.create(supplier);
        // new Random() 开始闭合,结束关闭,开始包含,结束不包含
        int selectNum = random.nextInt(MAX_BOUND);
        for (Prize s : prizes) {
            if (selectNum <= s.getNumber()) {
                return s.getId();
            }
        }
        return null;
    }


    /**
     * prize
     */
    @Data
    public static class Prize {

        private static List<List<Integer>> ratioList = new ArrayList<>();

        static {
            ratioList.add(Arrays.asList(100));
            ratioList.add(Arrays.asList(60, 100));
            ratioList.add(Arrays.asList(40, 75, 100));
            ratioList.add(Arrays.asList(40, 70, 90, 100));
            ratioList.add(Arrays.asList(35, 60, 80, 95, 100));
        }

        private Integer id;

        private Integer number;

        /**
         * 抽象算法
         *
         * @param list
         * @return
         */
        public static List<Prize> create(List<Integer> list) {
            Integer size = list.size();
            if (size > ratioList.size()) {
                size = ratioList.size();
            }
            List<Integer> ratios = ratioList.get(size - 1);
            List<Prize> prizes = new ArrayList<>(size);
            for (int i = 0; i < size; i++) {
                Prize prize = new Prize();
                prize.setId(list.get(i));
                prize.setNumber(ratios.get(i));
                prizes.add(prize);
            }
            return prizes;
        }
    }

}