package com.hzs.common.core.utils;

import cn.hutool.core.util.RandomUtil;
import com.hzs.common.core.constant.SysConstants;
import com.hzs.common.core.enums.EOrderPrefix;
import org.apache.commons.lang3.RandomUtils;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Description:
 * Author: sui q
 * Time: 2022/9/8 13:44
 * Classname: CommonUtil
 * PackageName: com.hzs.common.core.utils
 */
public class CommonUtil {

    /**
     * 获取流水编号
     *
     * @return string
     */
    public static String createSerialNumber() {
        return createSerialNumber(EOrderPrefix.DEFAULT);
    }

    /**
     * 获取流水编号
     *
     * @param eOrderPrefix EOrderPrefix 枚举获取
     * @return string
     */
    public static String createSerialNumber(EOrderPrefix eOrderPrefix) {
        return createSerialNumber(eOrderPrefix.getValue());
    }

    /**
     * 获取流水编号
     *
     * @param prefix 前缀，EOrderPrefix 枚举获取
     * @return string
     */
    public static String createSerialNumber(String prefix) {
        return prefix + System.currentTimeMillis() + RandomUtils.nextInt(100, 999);
    }

    /**
     * 创建批量流水编号
     *
     * @param eOrderPrefix 前缀枚举
     * @param count        数量
     * @return
     */
    public static List<String> createSerialNumberBatch(EOrderPrefix eOrderPrefix, int count) {
        if (count <= 0) {
            return Collections.emptyList();
        }
        List<String> codeList = new ArrayList<>(count);
        for (int i = 0; i < count; i++) {
            codeList.add(createSerialNumberOnly(codeList, eOrderPrefix.getValue()));
        }
        return codeList;
    }

    /**
     * 创建唯一流水编号
     *
     * @param codeList 流水编号列表
     * @param prefix   前缀
     * @return
     */
    private static String createSerialNumberOnly(List<String> codeList, String prefix) {
        String tmpCode = createSerialNumber(prefix);
        if (codeList.contains(tmpCode)) {
            return createSerialNumberOnly(codeList, prefix);
        }
        return tmpCode;
    }

    /**
     * 获取批次
     *
     * @return String
     */
    public static String createBatchNum() {
        //时间转字符串格式化
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
        return LocalDateTime.now(ZoneOffset.of("+8")).format(formatter) + RandomUtils.nextInt(100, 999);
    }

    public static String createSelfCode() {
        long number = System.currentTimeMillis() / 1000 + RandomUtils.nextInt(1000, 9999);
        return Long.toString(number);
    }

    /**
     * 返回删除用户编号
     *
     * @param memberCode
     * @return
     */
    public static String deleteMemberCode(String memberCode) {
        return memberCode + "-" + RandomUtil.randomInt(100, 999);
    }


    /**
     * 生成skuCode -- SKU编码（产品编号+规格ID，以-间隔）
     *
     * @param productCode 产品编码
     * @param specsIdStr  规则ID字符串
     * @return
     */
    public static String createSkuCode(String productCode, String specsIdStr) {
        if (StringUtils.isNotEmpty(specsIdStr)) {
            return productCode + "-" + specsIdStr.replace(",", "-");
        }
        return productCode;
    }


    /**
     * 根据体系判断会员名称还是会员昵称
     *
     * @param pkVertex   体系ID
     * @param memberName 会员名称
     * @param nickName   会员昵称
     * @return
     */
    public static String getMemberName(Long pkVertex, String memberName, String nickName) {
        return memberName;
//        // 2024.07.09 新需求，指定体系下如果有昵称优先使用昵称
//        if (null == pkVertex) {
//            return memberName;
//        }
//        if (StringUtils.isEmpty(nickName)) {
//            return memberName;
//        }
//        return SysConstants.US_VERTEX.equals(pkVertex) ? nickName : memberName;
    }

    /**
     * 如果有服务编号优先使用，没有则使用会员编号
     *
     * @param memberCode  会员编号
     * @param serviceCode 服务编号
     * @return
     */
    public static String getMemberCode(String memberCode, String serviceCode) {
        return memberCode;
//        // 2024.07.09 新需求，如果有服务编码优先使用
//        if (StringUtils.isNotEmpty(serviceCode)) {
//            return serviceCode;
//        }
//        return memberCode;
    }

}
