//#define test
using BPA.Message;
using BPA.Message.Enum;
using BPASmartClient.EventBus;
using BPASmartClient.Helper;
using BPASmartClient.Http;
using BPASmartClient.Message;
using BPASmartClient.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static BPASmartClient.EventBus.EventBus;

namespace BPASmartClient.Business
{
    /// <summary>
    /// 订单代理
    /// </summary>
    public class OrderProxy : IPlugin
    {
        //订单队列
        private ConcurrentDictionary<int, ConcurrentQueue<MorkOrderPush>> orders = new ConcurrentDictionary<int, ConcurrentQueue<MorkOrderPush>>();
        //运行标识
        private bool running = false;
        //设备管理
        private DeviceMgr deviceMgr;
        ConcurrentQueue<MorkOrderPush> morkOrderPushes = new ConcurrentQueue<MorkOrderPush>();
        /// <summary>
        /// 初始化
        /// </summary>
        public void Initialize()
        {
            deviceMgr = Plugin.GetInstance().GetPlugin<DeviceMgr>();
            if (InternetInfo.IsEnableTest)
            {
                ThreadManage.GetInstance().StartLong(new Action(() =>
                {
                    while (morkOrderPushes.Count > 0)
                    {
                        if (morkOrderPushes.TryDequeue(out MorkOrderPush mork))
                        {
                            Thread.Sleep(3000);
                            new OrderStatusChangedEvent() { Status = ORDER_STATUS.COOKING, SubOrderId = mork.SuborderId, GoodName = mork.GoodsName }.Publish();
                            Thread.Sleep(5000);
                            new OrderStatusChangedEvent() { Status = ORDER_STATUS.COMPLETED_COOK, SubOrderId = mork.SuborderId, GoodName = mork.GoodsName }.Publish();
                            Thread.Sleep(5000);
                            new OrderStatusChangedEvent() { Status = ORDER_STATUS.COMPLETED_TAKE, SubOrderId = mork.SuborderId, GoodName = mork.GoodsName }.Publish();
                            Thread.Sleep(2000);
                        }
                    }
                    Thread.Sleep(1000);
                }), "sim order");
            }
        }

        public void Start()
        {
            running = true;
            Plugin.GetInstance().GetPlugin<MQTTMgr>().SetMessageReciveHandler(delegate (IMessage message)
            {
                if (message == null) return;

                //订单消息
                if (message is MorkOrderPush morkOrderpush)
                {
                    if (!orders.ContainsKey(morkOrderpush.DeviceId))
                    {
                        orders.TryAdd(morkOrderpush.DeviceId, new ConcurrentQueue<MorkOrderPush>());
                        StartTargetDeviceOrderJob(morkOrderpush.DeviceId);
                    }
                    orders[morkOrderpush.DeviceId].Enqueue(morkOrderpush);
                }
                //辅料信息
                else if (message is RecipeBoms recipe)
                {
                    new RecipeBomEvent()
                    {
                        DeviceId = recipe.DeviceId,
                        recipeBoms = recipe
                    }.Publish();
                    MessageLog.GetInstance.Show("接收到 【 MQTT 】 的辅料信息");
                }
                //物料消息
                else if (message is OrderMaterialDelivery delivery)
                {
                    new MaterialDeliveryEvent()
                    {
                        DeviceId = delivery.DeviceId,
                        orderMaterialDelivery = delivery
                    }.Publish();
                    MessageLog.GetInstance.Show("接收到 【 MQTT 】 的物料信息");
                    delivery?.BatchingInfo?.ForEach(x =>
                    {
                        MessageLog.GetInstance.Show($"物料ID:=[{x.BatchingId}]，{x.BatchingLoc}号位置：{x.BatchingCount}");
                    });
                }
            });

            EventBus.EventBus.GetInstance().Subscribe<OrderStatusChangedEvent>(0, OrderStatusChangedHandle);
        }

        private void StartTargetDeviceOrderJob(int deviceId)
        {
            ThreadManage.GetInstance().Start(() =>
            {
                var device = deviceMgr.GetDevices().FirstOrDefault(p => p.DeviceId == deviceId);
                while (running)
                {
                    if (device.IsBusy /*|| !device.IsHealth*/)
                    {
                        Thread.Sleep(100);
                        continue;
                    }
                    while (orders[deviceId].Count > 0)
                    {
                        if (orders[deviceId].TryDequeue(out MorkOrderPush temp))
                        {
                            if (InternetInfo.IsEnableTest) morkOrderPushes.Enqueue(temp);
                            var orderEvent = DoOrderEvent.Make(temp);
                            orderEvent.DeviceId = device.DeviceId;
                            orderEvent.Publish();
                            ActionManage.GetInstance.Send("AddOrder", new object[] { temp, device });
                        }
                    }
                    Thread.Sleep(50);
                }
            }, $"MQTT 订单接收处理-设备[{deviceId}]", true);
        }

        public void OrderStatusChangedHandle(IEvent @event, EventCallBackHandle callBack)
        {
            OrderStatusChangedEvent orderStatusChangedEvent = @event as OrderStatusChangedEvent;
            string result = string.Empty;
            OrderStatusChange orderStatusChange = new OrderStatusChange()
            {
                CookingStatus = orderStatusChangedEvent.Status,
                SuborderId = orderStatusChangedEvent.SubOrderId,
                GoodName = orderStatusChangedEvent.GoodName
            };

            #region API 订单状态修改
            try
            {
                string header = $"[{InternetInfo.OrderServer}/order/robotstatuschange]_[{DateTime.Now.Ticks}]".AESEncrypt();
                string url = $"{InternetInfo.OrderServer}order/robotstatuschange";
                result = APIHelper.GetInstance.HttpRequest(url, header, orderStatusChange, RequestType.POST);
            }
            catch (Exception ex)
            {
                MessageLog.GetInstance.ShowEx(ex.ToString());
            }
            var res = JsonConvert.DeserializeObject<OrderStatusRsp>(result);
            ActionManage.GetInstance.Send("OrderStatusChange", orderStatusChangedEvent);
            MessageLog.GetInstance.Show(string.Format("订单状态改变，调用API执行结果{0}", res == null ? false : res.isSuccess));
            #endregion


            #region MQTT 订单状态修改
            var clientId = Plugin.GetInstance().GetPlugin<ConfigMgr>().ClientId;
            var temp = BPAPackage.Make(orderStatusChange, clientId, orderStatusChangedEvent.deviceClientType);
            var q = temp.Serialize(false);
            Plugin.GetInstance().GetPlugin<MQTTMgr>().Publish(TOPIC.GetInstance.GetAppTopic(clientId.ToString()), temp.Serialize(false));
            #endregion
        }


        /// <summary>
        /// 资源释放
        /// </summary>
        public void Dispose()
        {
            running = false;
        }


    }
}
