using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Slice;
using CommonNetwork_ICE.handler;
using CommonNetwork_ICE.Util;
using CommonNetwork_ICE.Client;
using CommonNetwork_ICE.Session;
using CommonLang.Log;
using System.Threading;

namespace CommonNetwork_ICE.Connector
{
    class TcpRouterClient// : Glacier2.Application
    {
        private static Logger log = LoggerFactory.GetLogger("TcpRouterClient");
        private IceTcpClient tcpClient;
        private IceClientNetSession netSession;
        private ICombatSessionPrx sessionPrx;
        private Ice.Communicator ic;
        private SessionPingThread ping;
        private Thread pingThread = null;

        public TcpRouterClient(IceTcpClient tcpClient, IceClientNetSession netSession)
        {
            this.tcpClient = tcpClient;
            this.netSession = netSession;
        }

        public void Open(Ice.InitializationData initData)
        {
            int timeOut = 0;
            Glacier2.RouterPrx multiRouterPrx;
            try
            {
                ic = Ice.Util.initialize(initData);
                multiRouterPrx = Glacier2.RouterPrxHelper.uncheckedCast(ic.getDefaultRouter());
                System.Guid guid = System.Guid.NewGuid();
                String id = guid.ToString();
                sessionPrx = ICombatSessionPrxHelper.checkedCast(multiRouterPrx.createSession("DUMMY_USER", "DUMMY_PWD"));

                Ice.ObjectAdapter adapter = ic.createObjectAdapterWithRouter("", multiRouterPrx);
                Ice.Identity idengtity = new Ice.Identity(id, multiRouterPrx.getCategoryForClient());
                TcpServerCallbackImpl tcpCallbackImpl = new TcpServerCallbackImpl(tcpClient.codec, netSession);
                ServerCallbackPrx callback = ServerCallbackPrxHelper.uncheckedCast(adapter.add(tcpCallbackImpl, idengtity));
                sessionPrx.SetCallback(callback);
                sessionPrx.ice_getConnection().setAdapter(adapter);
                adapter.activate();
                tcpClient.IsConnected = true;
                timeOut = (int)multiRouterPrx.getSessionTimeout();
            }
            catch (Exception e)
            {
                netSession.onException(e);
                return;
            }
            if(timeOut > 0)
            {
                ping = new SessionPingThread(tcpClient, multiRouterPrx, (timeOut * 1000) / 10);
                pingThread = new Thread(new ThreadStart(ping.run));
                pingThread.Start();
                log.Log("开启战斗PING线程.会话过期时间:" + timeOut);
            }
            return;
        }

        public void Send(TransMessage transMessage)
        {
            sessionPrx.begin_ClientToServer(transMessage);
        }

        public void Close()
        {
            if (ping != null)
            {
                ping.done();
                ping = null;
                try
                {
                    pingThread.Join();
                }
                catch (Exception e)
                {
                }
                pingThread = null;
            }
            if (sessionPrx != null)
            {
                try
                {
                    sessionPrx.ice_getConnection().getAdapter().destroy();
                }
                catch (Exception e)
                {
                    log.Log("关闭ICE客户端连接器发生异常:" + e.Message);
                }
                sessionPrx = null;
                try
                {
                    ic.shutdown();
                }
                catch (Exception e)
                {
                    log.Log("关闭ICE通讯通道发生异常:" + e.Message);
                }
            }
        }
    }
}