package net.northking.cctp.element.internal.utils;

import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Array;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Map;

/**
 * 报文操作
 *
 * @author fengxiang.zhang
 * @since 1.0
 */
public class MessageOperation {

    /**
     * <p>字符串转换为字节数组。</p>
     *
     * @param s       字符串
     * @param charset 字符集编码
     * @return 字节数组
     */
    public static byte[] stringToBytes(String s,String charset) {
        return s.getBytes(Charset.forName(charset));
    }

    /**
     * <p>字节数组转换为字符串。</p>
     *
     * @param bytes   字节数组
     * @param charset 字符集编码
     * @return 字符串
     */
    public static String bytesToString(byte[] bytes,String charset) {
        return new String(bytes, Charset.forName(charset));
    }

    /**
     * <p>获取字符串、数组长度及集合类型元素个数</p>
     *
     * @param object 字符串(String)、数组(Array)或集合(List/Map)对象
     * @return 字符串长度或元素个数
     */
    public static int getLength(Object object) {
        if (object instanceof String) {
            return object.toString().length();
        } else if (object instanceof Collection) {
            return ((Collection) object).size();
        } else if (object instanceof Map) {
            return ((Map) object).size();
        } else if (object.getClass().isArray()) {
            return Array.getLength(object);
        }
        throw new IllegalArgumentException("获取长度失败, 参数类型不支持");
    }

    /**
     * <p>字符串左填充。</p>
     *
     * @param s      字符串
     * @param length 字符串长度
     * @param pad    填充字符
     * @return 字符串
     */
    public static String leftPad(String s,int length,String pad) {
        return StringUtils.leftPad(s, length, pad);
    }

    /**
     * <p>字符串右填充。</p>
     *
     * @param s      字符串
     * @param length 字符串长度
     * @param pad    填充字符
     * @return 字符串
     */
    public static String rightPad(String s,int length, String pad) {
        return StringUtils.rightPad(s, length, pad);
    }

    /**
     * <p>10进制数转换16进制字符串表示形式。</p>
     *
     * @param num 10进制数
     * @return 16进制字符串
     */
    public static String intToHexString(int num) {
        return Integer.toHexString(num).toUpperCase();
    }

    /**
     * <p>16进制数据转10进制数。</p>
     *
     * @param hex 16进制数据
     * @return 10进制数
     */
    public static int hexStringToInt(String hex) {
        return Integer.parseInt(hex, 16);
    }

    /**
     * <p>16进制表示的数据转换为字节数组。</p>
     *
     * @param hex 16进制字符串
     * @return 字节数组
     */
    public static byte[] hexStringToBytes(String hex) {
        return BinaryUtils.hexStringToBytes(hex);
    }

    /**
     * <p>16进制表示的数据转换相应字符集编码字符串。</p>
     *
     * @param hex     16进制字符串
     * @param charset 字符集编码
     * @return 字符串
     */
    public static String hexStrToString(String hex,String charset) {
        return BinaryUtils.hexStrToString(hex, charset);
    }

}
