using CommonLang.Log;
using CommonLang.Protocol;
using CommonNetwork_ICE.Util;
using CommonServer.Protocol;
using CommonServer.Server;
using CommonServer_ICE.handler;
using CommonServer_ICE.Msg;
using CommonServer_ICE.Session;
using Slice;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CommonServer_ICE.Server
{
    /// <summary>
    /// ICE的UDP消息委托处理实现类
    /// </summary>
    public sealed class IceUdpServer : IceConnectServer
    {
        private static Logger log = LoggerFactory.GetLogger("IceUdpServer");

        public IceUdpServer(IPackageCodec codec)
            : base(codec)
        {
        }

        private SenderDisp_ GetServerSendHandler()
        {
            // 服务器消息委托处理类
            ServerMsgHandler msgHandlerDelegate = new ServerMsgHandlerUdpDelegate(this);
            return new ServerUdpSendHandler(msgHandlerDelegate);
        }

        /// <summary>
        /// 获取传输类型
        /// </summary>
        /// <returns></returns>
        internal override int getCommType()
        {
            return Constants.COMM_TYPE_UDP;
        }

        /// <summary>
        /// 返回会话总数量
        /// </summary>
        public override int SessionCount
        {
            get { return SessionManager.getAllSession().Count; }
        }

        /// <summary>
        /// 启动ICE服务器
        /// </summary>
        /// <returns></returns>
        internal override void StartIceServer()
        {
            SenderDisp_ serverSendHandler = GetServerSendHandler();
            // 初始化消息接收
            bool initServerSuccessed = serverConnector.InitRecvServer(Constants.COMM_TYPE_UDP, serverSendHandler);
            if (!initServerSuccessed)
            {
                throw new Exception("初始化服务器失败!");
            }
            init();
            log.Info("ICE UDP服务器启动侦听,IP【" + serverConnector.GetConnectorConfig().LocalIp + "】端口【" + serverConnector.GetConnectorConfig().LocalPort + "】。");
            // 等待关闭
            serverConnector.RecvConnector.waitForShutdown();
        }

        /// <summary>
        /// 服务器启动成功后执行各项初始化
        /// </summary>
        void init()
        {
            // 启动服务器端关键包消息发送队列
            SeverSendMsgManager.StartSendMsgQueue();
            // 启动服务器端会话检测任务
            SessionManager.StartSessionExpireTask();
        }

        //广播消息
        public override void Broadcast(IMessage message)
        {
            List<ISession> sessionList = SessionManager.getAllSession();
            foreach (ISession session in sessionList)
            {
                session.Send(message);
            }
        }

        /// <summary>
        /// 判断某个Session是否存在
        /// </summary>
        /// <param name="session"></param>
        /// <returns></returns>
        public override bool HasSession(ISession session)
        {
            return SessionManager.hasSession(session);
        }

        /// <summary>
        /// 获取单个Session
        /// </summary>
        /// <param name="sessionID"></param>
        /// <returns></returns>
        public override ISession GetSessionByID(string sessionID)
        {
            return SessionManager.getSession(sessionID);
        }

        /// <summary>
        /// 获取所有Session
        /// </summary>
        /// <returns></returns>
        public override IEnumerable<ISession> GetSessions()
        {
            return SessionManager.getAllSession();
        }

        /// <summary>
        /// 释放服务器资源
        /// </summary>
        public override void Dispose()
        {
            log.Info("关闭服务器,释放各种资源");
            // 关闭所有Session消息接收通道
            List<ISession> sessionList = SessionManager.getAllSession();
            foreach (ISession session in sessionList)
            {
                session.Disconnect(true);
            }
            SeverSendMsgManager.EndSendMsgQueue();
            SessionManager.EndSessionExpireTask();

            if (serverConnector != null)
            {
                serverConnector.Destroy();
            }

            this.serverListener.OnDestory();
        }
    }
}