package com.easyagents.skill.util;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CodingErrorAction;
import java.nio.charset.StandardCharsets;
import java.util.Objects;

/**
 * Skill 文本的严格 UTF-8 编码工具。
 */
public final class SkillUtf8 {

    private SkillUtf8() {
    }

    /**
     * 严格编码文本，拒绝孤立 surrogate 等非法 UTF-16 输入。
     *
     * @param text 待编码文本
     * @return UTF-8 字节
     * @throws CharacterCodingException 文本不能无损编码为 UTF-8
     */
    public static byte[] encode(String text) throws CharacterCodingException {
        ByteBuffer encoded = newEncoder().encode(CharBuffer.wrap(
                Objects.requireNonNull(text, "text")));
        byte[] bytes = new byte[encoded.remaining()];
        encoded.get(bytes);
        return bytes;
    }

    /**
     * 严格计算文本的 UTF-8 字节数。
     *
     * @param text 待计算文本
     * @return UTF-8 字节数
     * @throws CharacterCodingException 文本不能无损编码为 UTF-8
     */
    public static long byteLength(String text) throws CharacterCodingException {
        return newEncoder().encode(CharBuffer.wrap(
                Objects.requireNonNull(text, "text"))).remaining();
    }

    /**
     * 创建拒绝替换非法输入的 UTF-8 编码器。
     *
     * @return 严格 UTF-8 编码器
     */
    private static CharsetEncoder newEncoder() {
        return StandardCharsets.UTF_8.newEncoder()
                .onMalformedInput(CodingErrorAction.REPORT)
                .onUnmappableCharacter(CodingErrorAction.REPORT);
    }
}
