using HBLConsole.Abstract;
using HBLConsole.Interface;
using System;
using System.Reflection;
using BPA.Message.Enum;
using HBLConsole.GVL;
using BPA.Message;
using HBLConsole.Service;
using HBLConsole.Communication;

namespace HBLConsole.Factory
{
    public class SimpleFactory
    {

        private volatile static SimpleFactory _Instance;
        public static SimpleFactory GetInstance => _Instance ?? (_Instance = new SimpleFactory());
        private SimpleFactory() { }

        public AbstractMessageServer GetAbsMessageServer => _GetAbsMessageServer ?? (_GetAbsMessageServer = GetAbstractMessageServer());
        private AbstractMessageServer _GetAbsMessageServer;

        private string DeviceType => GeneralConfig.DeviceType.ToString();

        private object debugControl;

        public void MqttMessage(IMessage message)
        {
            GetAbsMessageServer.AddOrder(message);
            GetAbsMessageServer.GetBatchingInfo(message);
            GetAbsMessageServer.GetRecipeBom(message);
        }

        /// <summary>
        /// 获取物料信息
        /// </summary>
        public void GetBatchingInfo()
        {
            GetAbsMessageServer.GetBatchingInfo(InternetInfo.ClientId);
        }

        /// <summary>
        /// 订单状态更改
        /// </summary>
        /// <param name="subid"></param>
        /// <param name="status"></param>
        /// <returns></returns>
        public bool OrderChanged(string subid, ORDER_STATUS status)
        {
            bool res = GetAbsMessageServer.OrderStatusChange(subid, status);
            if (res)
            {
                ActionOperate.GetInstance.Send("OrderStatusChange", new OrderStatusChange()
                {
                    CookingStatus = status,
                    SuborderId = subid
                });
            }
            return res;
        }

        private AbstractMessageServer GetAbstractMessageServer()
        {
            string NameSpace = "HBLConsole.Business";
            Type type = Assembly.Load(NameSpace).GetType($"{NameSpace}.MessageServer.{DeviceType}");
            if (type == null)
                type = Assembly.Load(NameSpace).GetType($"{NameSpace}.MessageServer.Base");
            return Activator.CreateInstance(type) as AbstractMessageServer;
        }

        IControl control;
        /// <summary>
        /// 设备初始化
        /// </summary>
        public void DeviceInit()
        {
            string NameSpace = $"HBLConsole.{DeviceType}";//Load 加载的是dll的名称，GetType获取的是全命名空间下的类
            Type type = Assembly.Load(NameSpace).GetType($"{NameSpace}.Control_{DeviceType}");
            //control = Activator.CreateInstance(type) as IControl;
            control = (IControl)type?.GetProperty("Instance").GetValue(null);
            //IControl business = (IControl)type?.GetProperty("GetInstance").GetValue(null);
            GetBatchingInfo();
            control?.Init();
            ActionOperate.GetInstance.Register(new Action<object>((o) => { control?.DataParse(o); }), "DataParse");
            ActionOperate.GetInstance.Register(new Action(() => { control?.ConnectOk(); }), $"{GeneralConfig.DeviceType.ToString()}/ConnectOk");
            ActionOperate.GetInstance.Register(new Action<object>((o) => { control?.SimOrder(o); }), "SimOrder");
            ConnectHelper.GetInstance.Init();
        }

        public IGvl GetGvl()
        {
            Type type = control?.GetType();
            foreach (var item in type?.GetProperties())
            {
                var interfaces = item.PropertyType.GetInterfaces();
                if (interfaces != null)
                {
                    foreach (var inters in interfaces)
                    {
                        if (inters.Name.Equals("IGvl"))
                        {
                            return (type?.GetProperty(item.Name).GetValue(control, null)) as IGvl;
                        }
                    }
                }
            }
            return default;
        }

        public object GetDebugControl()
        {
            if (null == debugControl)
            {
                debugControl = Assembly.Load("HBLConsole.Debug").CreateInstance($"HBLConsole.Debug.Debug_{DeviceType}");
            }
            return debugControl;
        }
    }
}
