package io.wdd.func.oss.service;

import io.wdd.func.oss.config.OssConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

import static io.wdd.func.oss.config.OSSConfiguration.ALL_OSS_CONFIG;

/**
 * 对象存储后端选择
 * 指定一系列的策略，选出最为合适的OSS存储后端位置
 */
@Service
@Slf4j
public class OssBackendSelect {

    /**
     *  根据 OSS桶的名称前缀 返回一个桶
     * @param BackendPrefixName OSS桶的名称前缀
     * @return
     */
    public OssConfig one(String BackendPrefixName) {

        if (StringUtils.isEmpty(BackendPrefixName)) {
            return oneRandom();
        }

        List<OssConfig> ossConfigList = all(BackendPrefixName);

        if (ossConfigList.size() == 0) {
            log.error("没能找到合适的OSS后端存储，请确保输入正确！");
        } else if (ossConfigList.size() == 1) {
            return ossConfigList.get(0);
        }

        // 出现了多个后端存储，需要筛选出来只有一个的情况
        // todo 根据评分计算出来最合适的一个！
        // 选择当前储存容量最小的一个

        // 随机选择一个, 也算是一个算法吧
        Random random = new Random();
        int pos = random
                .ints(
                        0,
                        ossConfigList.size()
                )
                .findFirst()
                .getAsInt();


        return ossConfigList.get(pos);
    }

    /**
     * @return 返回 随意一个桶
     */
    public OssConfig oneRandom() {

        Random random = new Random();

        int pos = random
                .ints(
                        0,
                        ALL_OSS_CONFIG.size()
                )
                .findFirst()
                .getAsInt();

        return ALL_OSS_CONFIG.get(pos);
    }

    /**
     * 根据 OSS桶的名称前缀 返回所有的桶
     *
     * @param BackendPrefixName OSS桶的名称前缀
     * @return
     */
    public List<OssConfig> all(String BackendPrefixName) {

        return ALL_OSS_CONFIG
                .stream()
                .filter(
                        ossConfig -> ossConfig
                                .getName()
                                .startsWith(BackendPrefixName)
                )
                .collect(Collectors.toList());
    }


}
