package com.microservices.pms.utils;

import com.microservices.common.core.exception.ServiceException;

import java.util.Date;
import java.util.HashMap;
import java.util.UUID;
import java.util.function.Function;

/**
 * @author otto
 */
public class PmsUtils {
    /**
     * 产品标识使用六位随机值
     * @return 产品标识
     */
    public static String generateRandomProductIdentifier() {
        UUID uuid = UUID.randomUUID();
        // 截取UUID的一部分，例如前6个字符
        return uuid.toString().substring(0, 6).toUpperCase();
    }

    /**
     * 校验开始时间和结束时间
     * @param startDate 开始时间
     * @param endDate 结束时间
     */
    public static void validStartTimeAndEndTime(Date startDate, Date endDate) {
        if (startDate != null && endDate != null) {
            if (endDate.before(startDate)) {
                throw new ServiceException("结束时间不能早于开始时间");
            }
        }
    }

    /**
     * 从HashMap中获取缓存数据，当HashMap中不存在时执行传入的数据查询方法获取数据并存入缓存（当HashMap为null时直接返回执行数据查询的结果）
     * 使用方法名和输入参数作为缓存Key，简化代码
     * @param hashMap 缓存
     * @param dataRetrievalFunction 数据查询方法
     * @param args 查询方法输入参数
     * @return 结果
     * @param <T> 查询方法输入参数类型
     * @param <R> 返回数据类型
     */
    public static <T, R> R getSelectObjectInCache(HashMap<String, Object> hashMap, Function<T, R> dataRetrievalFunction, T args) {
        if (dataRetrievalFunction == null) {
            return null;
        }
        String cacheKey = dataRetrievalFunction.getClass().getSimpleName() + "-" + args;
        if (hashMap == null) {
            return dataRetrievalFunction.apply(args);
        }else if (hashMap.containsKey(cacheKey)) {
            @SuppressWarnings("unchecked")
            R r = (R) hashMap.get(cacheKey);
            return r;
        } else {
            R r = dataRetrievalFunction.apply(args);
            hashMap.put(cacheKey, r);
            return r;
        }
    }

    /**
     * 获取文件路径中文件所在的文件夹
     *
     * @return 文件夹
     */
    public static String parseDirectory(String filePath) {
        // 找到最后一个"/"的位置
        int lastSlashIndex = filePath.lastIndexOf('/');
        if (lastSlashIndex > 0) {
            // 截取到"/"之前的所有字符作为文件夹路径
            return filePath.substring(0, lastSlashIndex);
        }
        return "";
    }
}
