using NewLife;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using TouchSocket.Core;

namespace NDSD_Screwdriver.Tool
{
    public class MyFixedHeaderRequestInfo : IFixedHeaderRequestInfo
    {
        /// <summary>
        /// 接口实现，标识数据长度
        /// </summary>
        public int BodyLength { get; private set; }

        /// <summary>
        /// 自定义属性，标识数据类型
        /// </summary>
        public byte DataType { get; set; }

        /// <summary>
        /// 自定义属性，标识指令类型
        /// </summary>
        public byte OrderType { get; set; }

        /// <summary>
        /// 自定义属性，标识实际数据
        /// </summary>
        public byte[] Body { get; set; }


        public string GetBody()
        {

            // 方法1: 使用 Array.Copy
            byte[] copiedBytes = new byte[BodyLength - 2];
            Array.Copy(Body, 0, copiedBytes, 0, BodyLength - 2);
            Array.Reverse(copiedBytes);
            return copiedBytes.ToHex();
        }


        public bool OnParsingBody(ReadOnlySpan<byte> body)
        {
            if (body.Length == this.BodyLength)
            {
                this.Body = body.ToArray();
                return true;
            }
            return false;
        }

        public bool OnParsingHeader(ReadOnlySpan<byte> header)
        {
            //在该示例中，第一个字节表示后续的所有数据长度，但是header设置的是3，所以后续还应当接收length-2个长度。
            this.BodyLength = header[2] + 2;
            this.DataType = header[0];
            this.OrderType = header[1];
            return true;
        }
    }

    public class MyFixedHeaderCustomDataHandlingAdapter : CustomFixedHeaderDataHandlingAdapter<MyFixedHeaderRequestInfo>
    {
        /// <summary>
        /// 接口实现，指示固定包头长度
        /// </summary>
        public override int HeaderLength => 3;

        /// <summary>
        /// 获取新实例
        /// </summary>
        /// <returns></returns>
        protected override MyFixedHeaderRequestInfo GetInstance()
        {
            return new MyFixedHeaderRequestInfo();
        }
    }
}
