using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Reflection;
using System.ServiceModel;
using Topshelf;
using QMFrameWork.Common.Util;
using QMFrameWork.Cache;
using QM.Exchange.Core.Services;
using QM.Exchange.Core;

namespace QM.ServiceHost
{
    /// <summary>
    /// 服务管理器
    /// </summary>
    public class ManagerServer : ServiceControl
    {
        //登录服务
        System.ServiceModel.ServiceHost _loginServiceHost = new System.ServiceModel.ServiceHost(typeof(LoginService));

        //双工通讯服务
        System.ServiceModel.ServiceHost _DuplexMessageServiceHost = new System.ServiceModel.ServiceHost(typeof(DuplexMessageService));

        //普通通讯服务
        System.ServiceModel.ServiceHost _generalMessageServiceHost = new System.ServiceModel.ServiceHost(typeof(GeneralMessageService));
        
        //服务管理
        private ServiceManager _ServiceManager = new ServiceManager();

        #region 启动

        public bool StartService()
        {
            try
            {
                //装配数据工厂
                QMFrameWork.Data.DataFactory.Configure(true);

                //初始缓存
                CacheManager.Config();

                //启动登录服务
                if (_loginServiceHost.State != CommunicationState.Opening)
                    _loginServiceHost.Open();
                Console.WriteLine("登录服务:启动");

                //启动双工服务
                if (_DuplexMessageServiceHost.State != CommunicationState.Opening)
                    _DuplexMessageServiceHost.Open();

                Console.WriteLine("双工通讯服务:启动");

                //启动双工服务
                if (_generalMessageServiceHost.State != CommunicationState.Opening)
                    _generalMessageServiceHost.Open();

                Console.WriteLine("普通通讯服务:启动");

                //服务管理启动
                _ServiceManager.Start();                

                return true;
            }
            catch (Exception ex)
            {
                QMFrameWork.Log.LogManager.LogHelper.Error(
                        new QMFrameWork.Log.LogInfo { ClientIP = "localhost", UserName = "admin", Info = "启动服务", ErrorInfo = ex });
                throw;
            }
        }

        /// <summary>
        /// TopShelf's method delegated to <see cref="Start()"/>.
        /// </summary>
        public bool Start(HostControl hostControl)
        {
            DaulInstanceService.OnEnterMainService += new EventHandler((obj, e) =>
            {
                this.StartService();
            });
            DaulInstanceService.Start();

            return true;
        }

        #endregion

        #region 停止

        public bool StopService()
        {
            try
            {
                //停止服务          
                QMFrameWork.Data.DataFactory.Stop();

                _loginServiceHost.Close();
                _DuplexMessageServiceHost.Close();

                _ServiceManager.Stop();
                
                return true;
            }
            catch (Exception ex)
            {
                QMFrameWork.Log.LogManager.LogHelper.Error(
                        new QMFrameWork.Log.LogInfo { ClientIP = "localhost", UserName = "admin", Info = "停止服务", ErrorInfo = ex });
                throw;
            }
        }

        /// <summary>
        /// TopShelf's method delegated to <see cref="Stop()"/>.
        /// </summary>
        public bool Stop(HostControl hostControl)
        {
            DaulInstanceService.Stop();

            this.StopService();

            return true;
        }

        #endregion

    }
}