using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommonNetwork_ICE.Common;
using CommonLang.Protocol;
using CommonNetwork_ICE.Util;
using CommonNetwork_ICE.Session;
using Slice;
using CommonLang.Log;
using CommonNetwork_ICE.Client;

namespace CommonNetwork_ICE.Msg
{
    /// <summary>
    /// ICE消息委托处理类:根据客户端消息接收类的委托,处理服务器发来的ICE网络消息
    /// </summary>
    internal abstract class ClientMsgHandler
    {
        private static Logger log = LoggerFactory.GetLogger("ClientMsgHandler");
        // 数据包编码解码器
        public IceMessageCodec Codec { get; set; }
        // ICE客户端
        protected IceClientConnector iceClient;
        // 会话对象
        protected IceClientNetSession session;

        public ClientMsgHandler(IceClientConnector iceClient, IceClientNetSession session)
        {
            this.iceClient = iceClient;
            this.session = session;
        }

        /// <summary>
        /// 收到数据包
        /// </summary>
        /// <param name="message">数据包</param>
        /// <param name="ip">发送方IP</param>
        /// <param name="port">发送方端口</param>
        public abstract void RecvData(int recvPort, TransMessage message, String ip, int port);

        /// <summary>
        /// 处理发送数据后收到服务器的关键数据包响应
        /// </summary>
        /// <param name="serial"></param>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void SendDataRecvAck(int recvPort, long serial, string ip, int port)
        {
            log.Trace("收到服务器发来关键数据包响应,地址IP【" + ip + "】,端口【" + port + "】,编号:" + serial);
            iceClient.SetSentLastSerial(serial);
        }

        /// <summary>
        /// 处理服务器连接上客户端
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void Connect(string ip, int port)
        {
            // 目前服务器不会主动连接客户端,此方法客户端不实现
        }

        /// <summary>
        /// 处理收到服务器的连接成功响应
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void ConnectAck(string ip, int port)
        {
            iceClient.IsConnected = true;
            log.Info("收到服务器发来连接成功响应,地址IP【" + ip + "】,端口【" + port + "】");
        }

        /// <summary>
        /// 处理收到服务器的会话关闭请求,回发关闭响应
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void Close(int recvPort, string ip, int port)
        {
            iceClient.IsConnected = false;
            iceClient.Connector.Sender.CloseAck(recvPort);
            iceClient.Close();
            log.Info("收到服务器发来关闭连接请求,地址IP【" + ip + "】,端口【" + port + "】");
        }

        /// <summary>
        /// 处理收到服务器的会话关闭响应
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void CloseAck(int recvPort, string ip, int port)
        {
            iceClient.IsConnected = false;
            log.Info("收到服务器发来关闭成功响应,地址IP【" + ip + "】,端口【" + port + "】");
        }
    }
}