using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using CommonNetwork.Net;
using CommonLang.IO;
using CommonLang.ByteOrder;
using CommonLang.Protocol;
using System.Net;
using CommonLang.Net;
using CommonLang;
using CommonLang.Log;

namespace CommonNetwork.Sockets
{
    public abstract class BaseNetSession : INetSession
    {
        protected string mURL;
        protected long mSendBytes = 0;
        protected long mRecvBytes = 0;
        protected long mSendPacks = 0;
        protected long mRecvPacks = 0;
        private HashMap<string, object> mAttributes = new HashMap<string, object>();

        public long TotalSentBytes { get { return mSendBytes; } }
        public long TotalRecvBytes { get { return mRecvBytes; } }
        public long TotalSentPackages { get { return mSendPacks; } }
        public long TotalRecvPackages { get { return mRecvPacks; } }
        public string URL { get { return mURL; } }
        public abstract IPEndPoint RemoteAddress { get; }
        public abstract INetPackageCodec Codec { get; }
        /// <summary>
        /// 判断当前网络是否已经连接
        /// </summary>
        /// <returns></returns>
        public abstract bool IsConnected { get; }

        public abstract bool Open(string url, INetPackageCodec codec, INetSessionListener listener);

        public abstract bool Close();

        public virtual void Dispose()
        {
            Close();
        }

        //-------------------------------------------------------------------------------------

        /// <summary>
        /// 发送一个消息,该方法将立即返回。
        /// </summary>
        /// <param name="data"></param>
        public abstract void Send(Object data);

        public abstract void SendResponse(IMessage rsponse, int requestMessageID);

        //-------------------------------------------------------------------------------------

        public object GetAttribute(string key)
        {
            return mAttributes[key];
        }

        public void SetAttribute(string key, object value)
        {
            mAttributes[key] = value;
        }

        public void RemoveAttribute(string key)
        {
            mAttributes.Remove(key);
        }

        public bool ContainsAttribute(string key)
        {
            return mAttributes.ContainsKey(key);
        }

        public ICollection<string> GetAttributeKeys()
        {
            return mAttributes.Keys;
        }

        public override string ToString()
        {
            return "Session[" + URL + "](" + GetHashCode() + ")";
        }

        //-------------------------------------------------------------------------------------

        protected OnSessionOpenedHandler mOnSessionOpened;
        protected OnSessionClosedHandler mOnSessionClosed;
        protected OnMessageReceivedHandler mOnMessageReceived;
        protected OnMessageSentHandler mOnMessageSent;
        protected OnErrorHandler mOnError;

        public event OnSessionOpenedHandler OnSessionOpened { add { mOnSessionOpened += value; } remove { mOnSessionOpened -= value; } }
        public event OnSessionClosedHandler OnSessionClosed { add { mOnSessionClosed += value; } remove { mOnSessionClosed -= value; } }
        public event OnMessageReceivedHandler OnMessageReceived { add { mOnMessageReceived += value; } remove { mOnMessageReceived -= value; } }
        public event OnMessageSentHandler OnMessageSent { add { mOnMessageSent += value; } remove { mOnMessageSent -= value; } }
        public event OnErrorHandler OnError { add { mOnError += value; } remove { mOnError -= value; } }

        //-------------------------------------------------------------------------------------

    }


}