using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using BPA.Message;
using BPA.Message.Enum;
using BPASmartClient.Device;
using BPASmartClient.EventBus;
using BPASmartClient.Helper;
using BPASmartClient.Model;
using Microsoft.Toolkit.Mvvm.ComponentModel;

namespace BPASmartClient.ViewModel
{
    public class OrderStatusViewModel : ObservableObject
    {
        public OrderStatusViewModel()
        {

        }

        /// <summary>
        /// 订单状态列表
        /// </summary>
        public static ObservableCollection<MorkOrder> orderStatusLists { get; set; } = new ObservableCollection<MorkOrder>();

        /// <summary>
        /// 等待取餐列表
        /// </summary>
        public static ObservableCollection<MorkOrder> WaitTakeMeal { get; set; } = new ObservableCollection<MorkOrder>();

        /// <summary>
        /// MQTT 大屏取餐通知委托
        /// </summary>
        public static void Init()
        {
            //清除订单数据
            //ActionManage.GetInstance.Register(new Action(() =>
            //{
            //    Application.Current.Dispatcher.Invoke(() =>
            //    {
            //        orderStatusLists.Clear();
            //        WaitTakeMeal.Clear();
            //    });
            //}), "ClearOrders");

            ActionManage.GetInstance.Register(new Action<object[]>((o) =>
            {
                if (o is object[] obj)
                {
                    if (o.Length == 2)
                    {
                        if (o[0] is MorkOrderPush morkOrderpush && o[1] is IDevice device)
                        {
                            ObservableCollection<MorkOrder> observableCollection = new ObservableCollection<MorkOrder>();
                            MorkOrder morkOrder = new MorkOrder()
                            {
                                OrderPush = morkOrderpush,
                                OrderStatus = ORDER_STATUS.WAIT,
                                StartDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                            };
                            observableCollection.Add(morkOrder);
                            Application.Current?.Dispatcher.BeginInvoke((Action)delegate
                            {
                                int index = Array.FindIndex(Json<KeepDataBase>.Data.orderLists.ToArray(), p => p.DeviceId == device.DeviceId.ToString());
                                if (index < 0)
                                {
                                    Json<KeepDataBase>.Data.orderLists.Add(new OrderData()
                                    {
                                        DeviceId = device.DeviceId.ToString(),
                                        IsAllSelect = true,
                                        morkOrderPushes = observableCollection,

                                    });
                                }
                                else
                                {
                                    Json<KeepDataBase>.Data.orderLists.ElementAt(index).morkOrderPushes.Add(morkOrder);
                                }

                                orderStatusLists.Add(new MorkOrder()
                                {
                                    OrderPush = morkOrderpush,
                                    OrderStatus = ORDER_STATUS.WAIT,
                                    StartDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                });
                            });

                        }
                    }
                }

            }), "AddOrder");

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

            //ActionManage.GetInstance.Register(new Action<object>((o) =>
            //{
            //    if (o is OrderStatusChangedEvent orderStatusChange)
            //    {
            //        int index = Array.FindIndex(orderStatusLists.ToArray(), p => p.OrderPush.SuborderId == orderStatusChange.SubOrderId);
            //        switch (orderStatusChange.Status)
            //        {
            //            case ORDER_STATUS.COOKING:
            //                if (index >= 0 && index < orderStatusLists.Count)
            //                    orderStatusLists.ElementAt(index).OrderStatus = orderStatusChange.Status;
            //                break;
            //            case ORDER_STATUS.COMPLETED_COOK:
            //                if (index >= 0 && index < orderStatusLists.Count)
            //                {
            //                    Application.Current.Dispatcher.BeginInvoke((Action)delegate
            //                    {
            //                        orderStatusLists.ElementAt(index).OrderStatus = orderStatusChange.Status;
            //                        orderStatusLists.ElementAt(index).EndDate = DateTime.Now.ToString("HH:mm:ss");
            //                        TimeSpan timeSpan = DateTime.Now.Subtract(Convert.ToDateTime(orderStatusLists.ElementAt(index).StartDate));
            //                        orderStatusLists.ElementAt(index).CompleteDate = $"{timeSpan.TotalSeconds.ToString("0.00")} S";

            //                        //压力测试时注释，正常使用需要取消注释
            //                        if (!BPASmartClient.Business.InternetInfo.IsEnableTest)
            //                        {
            //                            WaitTakeMeal.Insert(0, orderStatusLists.ElementAt(index));
            //                            orderStatusLists.RemoveAt(index);
            //                        }

            //                    });
            //                }

            //                break;
            //            case ORDER_STATUS.COMPLETED_TAKE:
            //                if (BPASmartClient.Business.InternetInfo.IsEnableTest)
            //                    orderStatusLists.ElementAt(index).OrderStatus = orderStatusChange.Status;

            //                //压力测试时注释，正常使用需要取消注释
            //                var re = WaitTakeMeal.FirstOrDefault(p => p.OrderPush.SuborderId == orderStatusChange.SubOrderId);
            //                if (re != null)
            //                {
            //                    Application.Current.Dispatcher.BeginInvoke((Action)delegate
            //                    {
            //                        WaitTakeMeal.Remove(re);
            //                        var removeObj = Json<KeepDataBase>.Data.orderLists.FirstOrDefault(p => p.morkOrderPushes.FirstOrDefault(s => s.OrderPush.SuborderId == re.OrderPush.SuborderId) != null);
            //                        if (removeObj != null) Json<KeepDataBase>.Data.orderLists.Remove(removeObj);
            //                    });
            //                }
            //                break;
            //            default:
            //                break;
            //        }
            //    }
            //}), "OrderStatusChange");
        }

        private static void OrderStatusChangedHandle(IEvent @event, EventBus.EventBus.EventCallBackHandle callBack)
        {
            OrderStatusChangedEvent orderStatusChange = @event as OrderStatusChangedEvent;
            int index = Array.FindIndex(orderStatusLists.ToArray(), p => p.OrderPush.SuborderId == orderStatusChange.SubOrderId);
            switch (orderStatusChange.Status)
            {
                case ORDER_STATUS.COOKING:
                    if (index >= 0 && index < orderStatusLists.Count)
                        orderStatusLists.ElementAt(index).OrderStatus = orderStatusChange.Status;
                    break;
                case ORDER_STATUS.COMPLETED_COOK:
                    if (index >= 0 && index < orderStatusLists.Count)
                    {
                        Application.Current.Dispatcher.BeginInvoke((Action)delegate
                        {
                            orderStatusLists.ElementAt(index).OrderStatus = orderStatusChange.Status;
                            orderStatusLists.ElementAt(index).EndDate = DateTime.Now.ToString("HH:mm:ss");
                            TimeSpan timeSpan = DateTime.Now.Subtract(Convert.ToDateTime(orderStatusLists.ElementAt(index).StartDate));
                            orderStatusLists.ElementAt(index).CompleteDate = $"{timeSpan.TotalSeconds.ToString("0.00")} S";

                            //压力测试时注释，正常使用需要取消注释
                            if (!BPASmartClient.Business.InternetInfo.IsEnableTest)
                            {
                                WaitTakeMeal.Insert(0, orderStatusLists.ElementAt(index));
                                orderStatusLists.RemoveAt(index);
                            }

                        });
                    }

                    break;
                case ORDER_STATUS.COMPLETED_TAKE:
                    if (BPASmartClient.Business.InternetInfo.IsEnableTest)
                        orderStatusLists.ElementAt(index).OrderStatus = orderStatusChange.Status;

                    //压力测试时注释，正常使用需要取消注释
                    var re = WaitTakeMeal.FirstOrDefault(p => p.OrderPush.SuborderId == orderStatusChange.SubOrderId);
                    if (re != null)
                    {
                        Application.Current.Dispatcher.BeginInvoke((Action)delegate
                        {
                            WaitTakeMeal.Remove(re);
                            var removeObj = Json<KeepDataBase>.Data.orderLists.FirstOrDefault(p => p.morkOrderPushes.FirstOrDefault(s => s.OrderPush.SuborderId == re.OrderPush.SuborderId) != null);
                            if (removeObj != null) Json<KeepDataBase>.Data.orderLists.Remove(removeObj);
                        });
                    }
                    break;
                default:
                    break;

            }
        }
    }
}
