using Edge.Core.Processor;
using Edge.Core.Parser.BinaryParser.Util;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Edge.Core.Processor.Communicator;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;

namespace ShengJu_CUT100_DES
{
    public class MessageCutter : IMessageCutter<byte[]>
    {
        public byte[] Message { get; private set; }

        public event EventHandler OnMessageCut;
        public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
        private ILogger logger = NullLogger.Instance;

        private readonly List<byte> buffer = new List<byte>();


        /// 
        /// Message format:
        /// 数据长度       +  模块地址      +   命令代码       +    返回操作状态     +   模块返回的数据     +   校验字(累加和取反)
        /// LEN 本身 1 字节+模块地址 1 字节 +   命令代码 1 字节 +   数据块参数 1 字节 +   密钥值参数 6 字节  +    校验码 1 字节
        /// </summary>
        public MessageCutter(IServiceProvider services)
        {
            var loggerFactory = services.GetRequiredService<ILoggerFactory>();
            this.logger = loggerFactory.CreateLogger("DynamicPrivate_Comm_");
        }

        public void Feed(byte[] next)
        {
            try
            {
                //innerLogger.Debug(this.loggerAppendix + " " + next.ToHexLogString() + " is feed in Window in state: " + nextState);
                for (int i = 0; i < next.Length; i++)
                {
                    this.buffer.Add(next[i]);
                    //数据长度 range from 1-0x32
                    if (this.buffer[0] > 0x32 || this.buffer[0] < 5)
                    {
                        this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg()
                        {
                            Message = "invalid byte[0]: 0x" + this.buffer[0].ToString("X2") + ", clear buf anyway"
                        });
                        this.buffer.Clear();
                    }

                    //模块地址 range from 0-256
                    //if (this.buffer.Count >= 2 && this.buffer[1] == 0)
                    //{
                    //    this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg()
                    //    {
                    //        Message = "invalid byte[1]: 0x" + this.buffer[1].ToString("X2") + ", clear buf(valid byte[0]: 0x" + this.buffer[0].ToString("X2") + ") anyway"
                    //    });
                    //    this.buffer.Clear();
                    //}

                    //命令代码 range from 0x11-0xFF
                    if (this.buffer.Count >= 3
                            && this.buffer[2] < 0x11)
                    {
                        this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg()
                        {
                            Message = "invalid byte[2]: 0x" + this.buffer[2].ToString("X2") + ", clear buf anyway"
                        });
                        this.buffer.Clear();
                    }

                    if (this.buffer.Count > 1 && this.buffer.Count == this.buffer[0])
                    {
                        this.Message = this.buffer.ToArray();
                        var safe = this.OnMessageCut;
                        safe?.Invoke(this, null);
                        this.buffer.Clear();
                    }
                }
            }
            catch (Exception exx)
            {
                this.logger.LogError($"ShengJu_CUT100_DES.MessageCutter, " +
                    $"next: 0x{next?.ToHexLogString() ?? "null"}, " +
                    $"this.buffer: 0x{this.buffer?.ToHexLogString() ?? "null"}" +
                    $"{Environment.NewLine}exception detail: {exx}");
                throw;
            }
        }
    }
}