using log4net;
using MasaBlazorApp3.Pojo;
using SuperSimpleTcp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Channels;
using System.Threading.Tasks;
using System.Windows.Markup;

namespace MasaBlazorApp3.Port
{
    public class ScreenUtil
    {
        private readonly ILog logger = LogManager.GetLogger(typeof(ScreenUtil));
        SimpleTcpServer server = new SimpleTcpServer("0.0.0.0:8888");

        string ipport { get; set; } = "";
        public ScreenUtil()
        {
            server.Events.ClientConnected += (object sender, ConnectionEventArgs e) =>
            {
                ipport = e.IpPort;
                logger.Info($"[{e.IpPort}] client connected");
            };
            server.Events.ClientDisconnected += (object sender, ConnectionEventArgs e) =>
            {
                logger.Info($"[{e.IpPort}] client disconnected: {e.Reason}");
            };
            server.Events.DataReceived += (object sender, DataReceivedEventArgs e) =>
            {
                logger.Info($"[{e.IpPort}]: {e.Data.Array}");
            };
            // let's go!
            server.Start();
        }


        private byte[] head = new byte[] { 0xee, 0xb1, 0x12 };

        private byte[] end = new byte[] { 0xFF, 0xFC, 0xFF, 0xFF };
        public void SetStockInfo(ChannelStock channel, int screenId)
        {
            // 添加画面id
            byte[] a = Copy2NewArr(head, HighLow(screenId));


            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            //if (channel.DrugInfo.DrugName != null)
            //{
            byte[] content = Encoding.GetEncoding("gb2312").GetBytes(channel.Drug?.DrugName??"");
                a = WriteInfo(a, content, channel.ColNo * 10 + 1);
            //}
            //if (channel.DrugInfo.Manufactory != null)
            //{
                byte[] content1 = Encoding.GetEncoding("gb2312").GetBytes(channel.Drug?.Manufactory?? "");
                a = WriteInfo(a, content1, channel.ColNo * 10 + 2);
            //}
            //if (channel.DrugInfo.DrugSpec != null)
            //{
                byte[] content2 = Encoding.GetEncoding("gb2312").GetBytes(channel.Drug?.DrugSpec ?? "");
                a = WriteInfo(a, content2, channel.ColNo * 10 + 3);
            //}
            //if (channel.ManuNo != null)
            //{

                byte[] content3 = Encoding.GetEncoding("gb2312").GetBytes(channel.ManuNo);
                a = WriteInfo(a, content3, channel.ColNo * 10 + 4);
            //}
            //if (channel.EffDate != null)
            //{
                byte[] content4 = Encoding.GetEncoding("gb2312").GetBytes(channel.EffDate);
                a = WriteInfo(a, content4, channel.ColNo * 10 + 5);
            //}
            //if (channel.Quantity != null)
            //{
                byte[] content5 = Encoding.GetEncoding("gb2312").GetBytes(channel.Quantity.ToString());
                a = WriteInfo(a, content5, channel.ColNo * 10 + 6);
            //}
            // 添加结束块
            byte[] b = Copy2NewArr(a, end);
            server.Send(ipport, b);
        }


        public void TellChange(int d)
        {
            byte[] buffer = new byte[] { 0xee, 0xb5, 0x01, 0x00, 0xFF, 0xFC, 0xFF, 0xFF };

        }

        public void SetStockInfo(List<ChannelStock> channels, int screenId)
        {
            // 添加画面id
            byte[] a = Copy2NewArr(head, HighLow(screenId));


            for (int i = 0; i < channels.Count; i++)
            {
                ChannelStock channel = channels[i];
                if (channel.Drug.DrugName != null)
                {
                    byte[] content = Encoding.ASCII.GetBytes(channel.Drug.DrugName);
                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 1);
                }
                if (channel.Drug.Manufactory != null)
                {
                    byte[] content = Encoding.ASCII.GetBytes(channel.Drug.Manufactory);
                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 2);
                }
                if (channel.Drug.DrugSpec != null)
                {
                    byte[] content = Encoding.ASCII.GetBytes(channel.Drug.DrugSpec);
                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 3);
                }
                if (channel.ManuNo != null)
                {

                    byte[] content = Encoding.ASCII.GetBytes(channel.ManuNo);
                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 4);
                }
                if (channel.EffDate != null)
                {
                    byte[] content = Encoding.ASCII.GetBytes(channel.EffDate);
                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 5);
                }
                if (channel.Quantity != null)
                {
                    byte[] content = Encoding.ASCII.GetBytes(channel.Quantity.ToString());
                    a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 6);
                }


            }
            // 添加结束块
            byte[] b = Copy2NewArr(a, end);
            server.Send(ipport, b);
        }


        public byte[] WriteInfo(byte[] a, byte[] content, int id)
        {
            // 添加控件id
            byte[] b = Copy2NewArr(a, HighLow(id));
            // 添加需要向控件内写入的字节长度
            byte[] c = Copy2NewArr(b, HighLow(content.Length));
            // 写入内容
            return Copy2NewArr(c, content);
        }

        public byte[] HighLow(int data)
        {
            byte high = Convert.ToByte((data >> 8) & 0x00ff); //位运算：右移8位
            byte low = Convert.ToByte(data & 0x00ff);         //去掉高位
            return new byte[] {high, low};
        }

        public byte[] Copy2NewArr(byte[] source1, byte[] source2)
        {
            byte[] target = new byte[source1.Length + source2.Length];
            Buffer.BlockCopy(source1, 0, target, 0, source1.Length);
            Buffer.BlockCopy(source2, 0, target, source1.Length, source2.Length);
            return target;
        }



    }
}
