using System;
using System.Linq;
using System.Text;

namespace PSO2SERVER
{
    public class AsciiString
    {
        private byte[] data;

        // 获取字符串的长度
        public int Length => data.Length;

        // 从字符串初始化
        public AsciiString(string value)
        {
            // 确保字符串中只包含 ASCII 字符
            if (value.Any(c => c > 127))
            {
                throw new ArgumentException("字符串包含非 ASCII 字符。");
            }

            data = Encoding.ASCII.GetBytes(value);
        }

        // 从字节数组初始化
        public AsciiString(byte[] bytes)
        {
            data = bytes ?? throw new ArgumentNullException(nameof(bytes), "字节数组不能为 null");
        }

        // 获取 ASCII 字符串，去除尾部的 null 字节
        public string GetString()
        {
            return Encoding.ASCII.GetString(data).TrimEnd('\0');
        }

        // 获取底层字节数组
        public byte[] ToBytes()
        {
            return data;
        }

        // 重写 ToString 方法，直接返回 ASCII 字符串
        public override string ToString()
        {
            return GetString();
        }

        // 检查字节数组是否只包含有效的 ASCII 字符
        public bool IsValidAscii()
        {
            return data.All(b => b < 128);
        }

        // 静态方法，从字节数组创建 AsciiString 对象
        public static AsciiString FromBytes(byte[] bytes)
        {
            return new AsciiString(bytes);
        }

        // 静态方法，如果字符串过长则截断
        public static AsciiString TruncateIfNeeded(string value, int maxLength)
        {
            if (value.Length > maxLength)
            {
                value = value.Substring(0, maxLength);
            }

            return new AsciiString(value);
        }

        // 写入固定长度 ASCII 字符串，超出部分截断，空余部分用零填充
        public void WriteFixedLengthASCII(string str, int charCount)
        {
            // 确保字符串长度不超过规定的 charCount
            var writeAmount = Math.Min(str.Length, charCount);
            var paddingAmount = charCount - writeAmount;

            byte[] byteArray = Encoding.ASCII.GetBytes(str.Substring(0, writeAmount));

            // 可能存在的填充
            byte[] resultArray = new byte[charCount];
            Array.Copy(byteArray, resultArray, byteArray.Length);

            // 用零填充剩余部分
            if (paddingAmount > 0)
            {
                for (int i = byteArray.Length; i < charCount; i++)
                {
                    resultArray[i] = 0;
                }
            }

            data = resultArray;
        }

        // 写入固定长度的 UTF-16 字符串，超出部分截断，空余部分用零填充
        public void WriteFixedLengthUtf16(string str, int charCount)
        {
            var writeAmount = Math.Min(str.Length, charCount);
            var paddingAmount = charCount - writeAmount;

            byte[] byteArray = Encoding.Unicode.GetBytes(str.Substring(0, writeAmount));

            // 可能存在的填充
            byte[] resultArray = new byte[charCount * 2]; // UTF-16 每个字符占 2 个字节
            Array.Copy(byteArray, resultArray, byteArray.Length);

            // 用零填充剩余部分
            if (paddingAmount > 0)
            {
                for (int i = byteArray.Length; i < charCount * 2; i++)
                {
                    resultArray[i] = 0;
                }
            }

            data = resultArray;
        }

        // 重写 ToString 方法，返回字符串表示
        public string GetStringRepresentation()
        {
            return Encoding.ASCII.GetString(data);
        }
    }
}
