package org.springblade.file.util;

import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.RandomType;
import org.springblade.core.tool.utils.StringPool;
import org.springblade.core.tool.utils.StringUtil;

/**
 *  对象存储key工具类
 * @author bfhuange
 * @date 2024/10/29
 */
public class ObjectKeyUtils {
    /**
     *  object key 格式，前缀目录/ + id + 用户id后4位 + 后缀
     */
    private static final String FORMAT = "%s%s%s%s";
    /**
     *  用户id后缀位数
     */
    private static final int ID_SUFFIX_LENGTH = 4;

    private ObjectKeyUtils() {}

    /**
     * 生成 object key
     * @param dir 文件目录
     * @param fileName 文件名
     * @return
     */
    public static String generateObjectKey(String dir, String fileName) {
        // 目录字符串
        String dirString = ObjectKeyUtils.getDirString(dir);
        // 文件名后缀
        String fileNameSuffix = ObjectKeyUtils.getFileNameSuffix(fileName);
        // 用户id后4位
        String userIdSuffix = ObjectKeyUtils.getUserIdSuffix();
        // 格式，目录 + id + 用户id后4位 + 后缀
        return String.format(FORMAT, dirString, IdWorker.getId(), userIdSuffix, fileNameSuffix);
    }

    /**
     * 生成 object key
     * @param fileName 文件名
     * @return
     */
    public static String generateObjectKey(String fileName) {
        return ObjectKeyUtils.generateObjectKey(StringPool.EMPTY, fileName);
    }

    /**
     *  获取用户id后缀字符串
     * @return
     */
    private static String getUserIdSuffix() {
        Long userId = AuthUtil.getUserId();
        if (userId > 0) {
            String idString = userId.toString();
            if (idString.length() >= ID_SUFFIX_LENGTH) {
                // 截取用户id后几位
                return idString.substring(idString.length() - ID_SUFFIX_LENGTH);
            }
        }
        // 未获取到用户id，取随机数字
        return StringUtil.random(ID_SUFFIX_LENGTH, RandomType.INT);
    }

    /**
     * 获取目录字符串
     * @param dir
     * @return
     */
    private static String getDirString(String dir) {
        if (StringUtil.isBlank(dir)) {
            return StringPool.EMPTY;
        }
        if (dir.endsWith(StringPool.SLASH)) {
            return dir;
        }
        return dir + StringPool.SLASH;
    }

    /**
     * 获取文件名后缀
     * @param fileName 文件名
     * @return
     */
    private static String getFileNameSuffix(String fileName) {
        if (StringUtil.isBlank(fileName)) {
            return StringPool.EMPTY;
        }
        if (!fileName.contains(StringPool.DOT)) {
            return StringPool.EMPTY;
        }
        return fileName.substring(fileName.lastIndexOf(StringPool.DOT));
    }
}
