using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.Util;
namespace MECF.Framework.Common.Communications
{
    /// 
    /// 管理所有连接,通常在PLC之前
    /// 
    public class ConnectionManager : Singleton
    {
        public List ConnectionList
        {
            get
            {
                foreach (var conn in _connections)
                {
                    conn.IsConnected = _dicConnections[conn.Name].IsConnected;
                }
                return _connections;
            }
        }
        private Dictionary _dicConnections = new Dictionary();
        private List _connections = new List();
        public void Initialize()
        {
            OP.Subscribe("Connection.Connect", (string cmd, object[] args) =>
            {
                Connect((string) args[0]);
                return true;
            });
            OP.Subscribe("Connection.Disconnect", (string cmd, object[] args) =>
            {
                Disconnect((string)args[0]);
                return true;
            });
            DATA.Subscribe("Connection.List", () => ConnectionList);
        }
 
        public void Terminate()
        {
        }
        public void Subscribe(string name, IConnection conn)
        {
            if (string.IsNullOrEmpty(name))
            {
                return;
            }
            if (conn == null)
            {
                return;
            }
            _connections.Add(new NotifiableConnectionItem(){Address = conn.Address, Name = name});
            _dicConnections[name] = conn;
        }
        public void Connect(string name)
        {
            if (_dicConnections.ContainsKey(name) && _dicConnections[name] != null)
            {
                _dicConnections[name].Connect();
            }
        }
        public void Disconnect(string name)
        {
            if (_dicConnections.ContainsKey(name) && _dicConnections[name] != null)
            {
                _dicConnections[name].Disconnect();
            }
        }
    }
}