using System;
using System.Collections.Generic;
using System.Linq;
using Edge.Core.Parser.BinaryParser.Util;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using VaporRecoveryOnlineWatchHubApp;
using Wayne_VaporRecoveryDataCollectorBoard.MessageEntity;
using Wayne_VaporRecoveryDataCollectorBoard.MessageEntity.Incoming;
using Wayne_VaporRecoveryDataCollectorBoard.MessageEntity.Outgoing;

namespace Wayne_VaporRecoveryDataCollectorBoard_Test
{
    [TestClass]
    public class ParserTest
    {
        public static bool ValueEquals(IEnumerable<byte> array1, IEnumerable<byte> array2)
        {
            if (array1 == null && array2 == null)
            {
                return true;
            }

            if ((array1 == null) || (array2 == null))
            {
                return false;
            }

            if (array1.Count() != array2.Count())
            {
                return false;
            }
            if (array1.Equals(array2))
            {
                return true;
            }
            else
            {
                for (int Index = 0; Index < array1.Count(); Index++)
                {
                    if (!Equals(array1.ElementAt(Index), array2.ElementAt(Index)))
                    {
                        return false;
                    }
                }
            }
            return true;
        }

        [TestMethod]
        public void READ_HISTORY_NUM_Request_TestMethod1()
        {
            READ_HISTORY_NUM_Request request = new READ_HISTORY_NUM_Request(1) { Address = 1 };
            Wayne_VaporRecoveryDataCollectorBoard.Parser parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var expected = new byte[] { 0x68, 01, 07, 01, 01, 0x0A, 0x16 };
            var actual = parser.Serialize(request);
            Assert.AreEqual(true, ValueEquals(expected, actual));
        }

        [TestMethod]
        public void SET_ADDRESS_Request_TestMethod1()
        {
            SET_ADDRESS_Request request = new SET_ADDRESS_Request(17, 5);
            Wayne_VaporRecoveryDataCollectorBoard.Parser parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var expected = new byte[] { 0x68, 00, 0xA1, 05, 0x11, 00, 00, 00, 0x05, 0xBC, 0x16 };
            var actual = parser.Serialize(request);
            Assert.AreEqual(true, ValueEquals(expected, actual), "0x" + actual.GetHexString());
        }

        [TestMethod]
        public void READ_ONE_HISTORY_DATA_Response_TestMethod1()
        {
            var raw = new byte[] { 
                // spliter
                0x68, 
                // Address
                0x01, 
                // CommandCode
                0x03, 
                // DataFieldLength
                0x1B, 
                // Board nozzle number
                0x03, 
                //FuellingStartTime
                0x18, 0x04, 0x25, 0x18, 0x46, 0x49, 0x03, 
                //LiquidVolume
                0x00,  0x01, 0x9E, 0xA6, 
                //AirVolume
                0x00, 0x00, 0x00, 0x08, 
                //FuellingEndTime
                0x18, 0x04, 0x25, 0x18, 0x47, 0x38, 0x03,

                0x00, 0x04, 0xC7, 0x70, 0x6E, 0x16 };
            var parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var actual = parser.Deserialize(raw) as READ_ONE_HISTORY_DATA_Response;
            Assert.AreEqual(true, actual.NozzleNumber == 3);
            var debugStr = actual.ToLogString();
        }

        [TestMethod]
        public void READ_ONE_HISTORY_DATA_Response_TestMethod2()
        {
            var raw = new byte[] { 0x68, 0x01, 0x03, 0x1B, 0x02, 0x18, 0x04, 0x25, 0x18, 0x46, 0x49, 0x03, 0x00, 0x01, 0x9E, 0xA6, 0x00, 0x00, 0x00, 0x08, 0x18, 0x04, 0x25, 0x18, 0x47, 0x38, 0x03, 0x00, 0x04, 0xC7, 0x70, 0x6E, 0x16 };
            var parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var actual = parser.Deserialize(raw) as READ_ONE_HISTORY_DATA_Response;
            Assert.AreEqual(true, actual.NozzleNumber == 2);
            var debugStr = actual.ToLogString();
        }

        [TestMethod]
        public void READ_PARA_Response_TestMethod1()
        {
            var raw = new byte[] { 0x68, 0x01, 0x06, 0x23, 0x01, 0x05, 0x01, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x27, 0x10, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x04, 0x4C, 0x00, 0x00, 0x4E, 0x20, 0x00, 0x00, 0x4E, 0x20, 0xDE, 0x16 };
            Wayne_VaporRecoveryDataCollectorBoard.Parser parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var response = parser.Deserialize(raw) as READ_PARA_Response;
            var debugStr = response.ToLogString();
        }

        [TestMethod]
        public void READ_WORKING_AND_TYPE_Response_TestMethod1()
        {
            var raw = new byte[] { 0x68, 0x01, 0x01, 0x0E, 0x11, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x16 };
            Wayne_VaporRecoveryDataCollectorBoard.Parser parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var response = parser.Deserialize(raw) as READ_WORKING_AND_TYPE_Response;
            var debugStr = response.ToLogString();
        }

        [TestMethod]
        public void READ_WORKING_AND_TYPE_Response_TestMethod2()
        {
            var raw = new byte[] { 0x68, 0x01, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0B, 0x16 };
            var parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var actual = parser.Deserialize(raw) as READ_WORKING_AND_TYPE_Response;
            var debugStr = actual.ToLogString();
        }

        [TestMethod]
        public void READ_WORKING_AND_TYPE_Response_TestMethod3()
        {
            //包起始标志(1B)+采集器地址Addr(1B)+命令代码(1B)+数据域长度(1B)+数据域(由数据域长度指定)+校验CS(1B)+包结束标志(1B)
            var raw = new byte[] { 0x68, 0x01, 0x01, 0x05,
                0xFE, 0x0B, 0x68, 0x83, 0x06,
                0x09, 0x16 };
            var parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var actual = parser.Deserialize(raw) as READ_WORKING_AND_TYPE_Response;
            var debugStr = actual.ToLogString();

            var liquidAndAirFlowData =
                                actual.NozzleLiquidAndAirFlowData.FirstOrDefault(n => n.Item1 == 2);
            var vaporVolumeWithDecimal = Util.RoundToDouble(liquidAndAirFlowData.Item3 / 1000);
            var liquidVolumeWithDecimal = Util.RoundToDouble(liquidAndAirFlowData.Item2 / 1000);
            var vaporAndLiquidRatio = Util.RoundToDouble(vaporVolumeWithDecimal / liquidVolumeWithDecimal);

        }

        [TestMethod]
        public void READ_WORKING_AND_TYPE_Response_TestMethod4()
        {
            //包起始标志(1B)+采集器地址Addr(1B)+命令代码(1B)+数据域长度(1B)+数据域(由数据域长度指定)+校验CS(1B)+包结束标志(1B)
            var raw = "68 06 00 00 16 00".ToBytes();
            var parser = new Wayne_VaporRecoveryDataCollectorBoard.Parser();
            var actual = parser.Deserialize(raw) as COLLECTOR_BUSY_Response;
            var debugStr = actual.ToLogString();
            Assert.AreEqual(true, actual != null);
        }
    }
}