using IMCS.Device;
using IMCS.Device.body;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using YG.Device;
namespace YG
{
    /// 
    /// 命令列表
    /// 
    public class DeviceManage
    {
        //public static DeviceInfo info = new DeviceInfo();
        private static string RETVAL = "success";
        private static int ASK_TIMES = 20;
        private static string VirtualProgram = ConfigurationManager.AppSettings["VirtualProgram"];
        private static int HEX_BINARY = 8;
        private uint currentToolArea = 1;
        private static string ConncetionRedisString = ConfigurationManager.AppSettings["ConncetionRedisString"];
        private static string HttpServerUrlString = ConfigurationManager.AppSettings["HttpServerUrlString"];
        private static string NcExtendPath = ConfigurationManager.AppSettings["NcExtendPath"];
        private static string NcUpLoadPath = ConfigurationManager.AppSettings["NcUpLoadPath"];
        private static string LocalNcPath = ConfigurationManager.AppSettings["LocalNcPath"];
        private static string ClsSFTP_IP = ConfigurationManager.AppSettings["ClsSFTP_Ip"];
        private static string ClsSFTP_Port = ConfigurationManager.AppSettings["ClsSFTP_Port"];
        private static string ClsSFTP_UserName = ConfigurationManager.AppSettings["ClsSFTP_UserName"];
        private static string ClsSFTP_PWD = ConfigurationManager.AppSettings["ClsSFTP_Pwd"];
        private static string ConncetionDeviceListString = ConfigurationManager.AppSettings["ConncetionDeviceListString"];
        private static string ClsSFTPListString = ConfigurationManager.AppSettings["ClsSFTPListString"];
        /// 
        /// 柔性线-机器人地址
        /// 
        private static string Path_Flexible_Roboot_Path = ConfigurationManager.AppSettings["Flexible_Roboot_Path"];
        /// 
        /// 柔性线-机床1
        /// 
        private static string Path_Flexible_Machine1_Path = ConfigurationManager.AppSettings["Flexible_Machine1_Path"];
        /// 
        /// 柔性线-机床2
        /// 
        private static string Path_Flexible_Machine2_Path = ConfigurationManager.AppSettings["Flexible_Machine2_Path"];
        /// 
        /// 柔性线-机床3
        /// 
        private static string Path_Flexible_Machine3_Path = ConfigurationManager.AppSettings["Flexible_Machine3_Path"];
        /// 
        /// 柔性线-机床4
        /// 
        private static string Path_Flexible_Machine4_Path = ConfigurationManager.AppSettings["Flexible_Machine4_Path"];
        /// 
        /// 柔性线-打标机
        /// 
        private static string Path_Flexible_Print_Path = ConfigurationManager.AppSettings["Flexible_Print_Path"];
        /// 
        /// 柔性线-清洗剂
        /// 
        private static string Path_Flexible_Clean_Path = ConfigurationManager.AppSettings["Flexible_Clean_Path"];
        /// 
        /// 智能单元-机器人
        /// 
        private static string Path_Intelligent_Roboot_Path = ConfigurationManager.AppSettings["Intelligent_Roboot_Path"];
        /// 
        /// 智能单元-机床
        /// 
        private static string Path_Intelligent_Machine_Path = ConfigurationManager.AppSettings["Intelligent_Machine_Path"];
        /// 
        /// 质量中心-机器人
        /// 
        private static string Path_Quality_Roboot_Path = ConfigurationManager.AppSettings["Quality_Roboot_Path"];
        private static DeviceManage coml = new DeviceManage();
        public static DeviceManage Instance { get { return coml; } }
        /// 
        /// 设备列表管理
        /// 
        public Dictionary device { get; set; } = new Dictionary();
        public Dictionary deviceList { get; set; } = new Dictionary();
        public DeviceManage()
        {
            device = new Dictionary();
            Init();
        }
        //初始化信息 建立所有协议连接
        public void Init()
        {
            List devices = GetConnectDeviceList();
            foreach (ConnectDeviceBody connectDevice in devices)
            {
                DeviceList deviceInfo = null;
                if (connectDevice.ProtocolType.Equals(DeviceType.OPCUa.ToString()))
                {
                    deviceInfo = new Device.DeviceOPCUat("opc.tcp://" + connectDevice.ServerUrl, connectDevice.UserName, connectDevice.Password);
                    deviceInfo.Dtype = DeviceType.OPCUa;
                }
                else if (connectDevice.ProtocolType.Equals(DeviceType.Socket.ToString()))
                {
                    if (deviceList.Where(m => m.Key.Equals(connectDevice.ServerUrl)).Count() == 0)
                    {
                        deviceInfo = new Device.DeviceSocket(connectDevice.Ip, connectDevice.Port);//8074   
                        deviceInfo.Dtype = DeviceType.Socket;
                        deviceInfo.DeviceInit();
                       
                    }
                }
                else if (connectDevice.ProtocolType.Equals(DeviceType.PLC_S7.ToString()))
                {
                    deviceInfo = new Device.DeviceS7(HslCommunication.Profinet.Siemens.SiemensPLCS.S1200, connectDevice.Ip);
                    deviceInfo.Dtype = DeviceType.PLC_S7;
                    deviceInfo.DeviceInit();
                }
                if (deviceInfo != null)
                {
                    deviceInfo.ServerUrl = connectDevice.ServerUrl;
                    deviceInfo.Ip = connectDevice.Ip;
                    deviceList.Add(connectDevice.ServerUrl, deviceInfo);
                }
            }
        }
       
        /// 设备列表
        public List GetConnectDeviceList()
        {
            List list = new List();
            string[] deviceList = ConncetionDeviceListString.Split('#');
            foreach (string dArray in deviceList)
            {
                if (!string.IsNullOrEmpty(dArray))
                {
                    string[] deviceArray = dArray.Split(';');
                    ConnectDeviceBody deviceInfo = new ConnectDeviceBody();
                    if ((deviceArray[0]).Ping())
                    {
                        deviceInfo.Ip = deviceArray[0];
                        deviceInfo.Port = int.Parse(deviceArray[1]);
                        deviceInfo.UserName = deviceArray[2];
                        deviceInfo.Password = deviceArray[3];
                        deviceInfo.ProtocolType = deviceArray[4];
                        deviceInfo.ServerUrl = deviceInfo.Ip + ":" + deviceInfo.Port;
                        list.Add(deviceInfo);
                    }
                }
            }
            return list;
        }
        /// SFTP设备列表
        public List GetSFTPDeviceList()
        {
            List list = new List();
            string[] deviceList = ClsSFTPListString.Split('#');
            foreach (string dArray in deviceList)
            {
                if (!string.IsNullOrEmpty(dArray))
                {
                    string[] deviceArray = dArray.Split(';');
                    SFTPDeviceBody deviceInfo = new SFTPDeviceBody();
                    deviceInfo.Ip = deviceArray[0];
                    deviceInfo.Port = deviceArray[1];
                    deviceInfo.UserName = deviceArray[2];
                    deviceInfo.Password = deviceArray[3];
                    deviceInfo.Path = deviceArray[4];
                    deviceInfo.NcExtendPath = deviceArray[5];
                    list.Add(deviceInfo);
                }
            }
            return list;
        }
        public SFTPDeviceBody GetSFTPOne(string ip)
        {
            List list = GetSFTPDeviceList();
            SFTPDeviceBody retBody = new SFTPDeviceBody();
            foreach (SFTPDeviceBody body in list)
            {
                if (body.Ip.Equals(ip))
                {
                    retBody = body;
                }
            }
            return retBody;
        }
        /// 
        /// 添加设备到设备列表
        /// 
        /// 
        /// 
        public void DeviceAdd(DeviceList devive, EnumDeviceList enumdev)
        {
            device.Add(enumdev, devive);
        }
        public DeviceList GetOne(EnumDeviceList enumDeviceList)
        {
            return device.Where(m => m.Key.Equals(enumDeviceList)).FirstOrDefault().Value;
        }
        public DeviceList GetOne(string serviceUrl)
        {
            return deviceList.Where(m => m.Key.Equals(serviceUrl)).FirstOrDefault().Value;
        }
        public void DeviceSend(EnumDeviceList enumdev, EnumComList com)
        {
            Log.Instance.WriteLogAdd(string.Format("{0}发送一次数据{1}", enumdev, com));
            device.Where(m => m.Key.Equals(enumdev)).FirstOrDefault().Value.DeviceSend(ReturnCom(com));
            System.Threading.Thread.Sleep(500);
        }
        /// 
        /// 发送指令
        /// 
        /// 
        public void DeviceClose()
        {
            foreach (var dc in device)
            {
                dc.Value.DeviceClose();
            }
        }
        public string ReturnCom(EnumComList enumComList)
        {
            return "";
        }
    }
}