package com.easyagents.skill.util;

import com.easyagents.skill.exception.SkillException;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Skill 内容 hash 工具。
 */
public final class SkillHashes {

    private static final String SHA_256 = "SHA-256";

    private SkillHashes() {
    }

    /**
     * 计算 SHA-256 内容引用。
     *
     * @param bytes 内容字节
     * @return sha256 内容引用
     */
    public static String sha256Ref(byte[] bytes) {
        return "sha256:" + sha256Hex(bytes);
    }

    /**
     * 计算 SHA-256 十六进制值。
     *
     * @param bytes 内容字节
     * @return 十六进制 hash
     */
    public static String sha256Hex(byte[] bytes) {
        return toHex(newSha256Digest().digest(bytes == null ? new byte[0] : bytes));
    }

    /**
     * 创建新的 SHA-256 摘要器。
     *
     * @return SHA-256 摘要器
     */
    public static MessageDigest newSha256Digest() {
        try {
            return MessageDigest.getInstance(SHA_256);
        } catch (NoSuchAlgorithmException e) {
            throw new SkillException("SHA-256 algorithm is unavailable.", e);
        }
    }

    /**
     * 将字节转为小写十六进制文本。
     *
     * @param bytes 原始字节
     * @return 小写十六进制文本
     */
    public static String toHex(byte[] bytes) {
        StringBuilder builder = new StringBuilder(bytes.length * 2);
        for (byte item : bytes) {
            builder.append(Character.forDigit((item >>> 4) & 0x0F, 16));
            builder.append(Character.forDigit(item & 0x0F, 16));
        }
        return builder.toString();
    }
}
