using IceCoffee.FastSocket.Tcp;
using langguanApi.Model;
using System.Text;
namespace langguanApi.Service.HJ212
{
    public class NetSession : TcpSession
    {
        private StringBuilder _unpackCache;
        public NetSession(TcpServer server) : base(server)
        {
        }
        protected override void OnClosed()
        {
            base.OnClosed();
            _unpackCache?.Clear();
        }
        /// 
        /// 获取分包缓存
        /// 
        /// 
        private StringBuilder GetUnpackCache()
        {
            return _unpackCache ??= new StringBuilder();
        }
        /// 
        /// 
        /// 
        protected override void OnReceived()
        {
            if (ReadBuffer.IndexOf(35) != 0L)// '#'
            {
                return;
                // throw new Exception("异常TCP连接 IP: " + RemoteIPEndPoint);
            }
            string rawText = null;
            while (ReadBuffer.CanReadLine)
            {
                try
                {
                    byte[] data = ReadBuffer.ReadLine();
                    rawText = Encoding.UTF8.GetString(data);
                    NetPackage netPackage = NetPackage.Parse(rawText, GetUnpackCache);
                    ((NetServer)Server).RaiseReceivedData(this, netPackage, rawText);
                    if (netPackage.DataSegment.PackageFlag != null && netPackage.DataSegment.PackageFlag.A == 1)
                    {
                        Response(netPackage);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"error :OnReceived:{ex.Message},data:{ex.Data}");
                }
            }
        }
        /// 
        /// 应答
        /// 
        private void Response(NetPackage netPackage)
        {
            try
            {
                netPackage.DataSegment.ST = DataSegment.ResponseST;
                netPackage.DataSegment.CN = CommandNumber.DataResponse;
                netPackage.DataSegment.PackageFlag.A = 0;
                netPackage.DataSegment.PackageFlag.D = 0;
                netPackage.DataSegment.CpCommand.ExeRtn = ResponseCode.ExecSucceeded;
                string rawText = netPackage.Serialize();
                byte[] data = Encoding.UTF8.GetBytes(rawText);
                SendAsync(data);
                ((NetServer)Server).RaiseSendData(this, netPackage, rawText);
            }
            catch (Exception ex)
            {
                throw new Exception("Error in NetSession", ex);
            }
        }
    }
}