/********************************************************************************
 *	文件名:	Event.cs
 *	全路径:	\Script\Event\EventSystem.cs
 *	创建人:	李嘉
 *	创建时间:2013-11-01
 *
 *	功能说明:事件处理函数对外接口
 *	修改记录:
*********************************************************************************/

using System.Collections.Generic;
using Games.AI_Logic;
using Games.GlobeDefine;
using GCGame.Table;

namespace Games.Events
{
    public class EventSystem : Singleton<EventSystem>
    {
        //消息队列
        private readonly List<GameEvent> m_DelayEventQueue;

        public EventSystem()
        {
            m_DelayEventQueue = new List<GameEvent>();
        }

        public bool Init()
        {
            return true;
        }

        //外部调用发送事件接口
        public void PushEvent(GameEvent _event)
        {
            if (_event.IsDelay)
                //延迟时间,加入队列,等待处理
                m_DelayEventQueue.Add(_event);
            else
                //非延迟事件,马上处理
                _ProcessEvent(_event);
        }

        public void UpdateDelayEventQueue()
        {
            for (var i = 0; i < m_DelayEventQueue.Count; ++i)
                //延迟事件,等待延迟结束处理
                if (m_DelayEventQueue[i].IsDelayFinish())
                    _ProcessEvent(m_DelayEventQueue[i]);
        }

        //实际事件处理接口
        private void _ProcessEvent(GameEvent _event)
        {
            //首先弹出这个Events
            m_DelayEventQueue.Remove(_event);
            switch (_event.EventID)
            {
                case GameDefine_Globe.EVENT_DEFINE.EVENT_ENTERGAME:
                {
                    //举个例子,之后处理函数过多的时候可以考虑封装
                    var nLevel = _event.GetIntParam(0);
                    LoadingWindow.LoadScene((GameDefine_Globe.SCENE_DEFINE) nLevel);
                }
                    break;
                case GameDefine_Globe.EVENT_DEFINE.EVENT_MISSION_COLLECTITEM:
                {
                    var mainPlayer = Singleton<ObjManager>.Instance.MainPlayer;
                    if (!mainPlayer)
                        return;
                    mainPlayer.StopMove();
                    GameManager.gameManager.AutoSearch.Stop();

                    if (GameManager.gameManager.PlayerDataPool.m_objMountParam.AdvanceMountId > 0)
                    {
                        mainPlayer.CurObjAnimState = GameDefine_Globe.OBJ_ANIMSTATE.STATE_FINSH;
                        mainPlayer.AskUnMount();

                        var gameEvent = new GameEvent();
                        gameEvent.Reset();
                        gameEvent.EventID = GameDefine_Globe.EVENT_DEFINE.EVENT_COLLECTUNMOUNTCALLBACK;

                        mainPlayer.UnMountEventCallBack = gameEvent;
                        return;
                    }

                    GameManager.gameManager.MissionManager.MissionCollectItemUnMountCallBack();
                }
                    break;
                case GameDefine_Globe.EVENT_DEFINE.EVENT_CHANGESCENE:
                {
                    var nLevel = _event.GetIntParam(0);
                    var actLevel = GameManager.gameManager.RunningScene;
                    var tabTarLevel = TableManager.GetSceneClassByID(nLevel);
                    var tabActLevel = TableManager.GetSceneClassByID(actLevel);

                    if (Singleton<ObjManager>.Instance.MainPlayer != null)
                    {
                        Singleton<ObjManager>.Instance.MainPlayer.OnPlayerLeaveScene();
                        if (tabActLevel != null && tabActLevel.EffectID >= 0)
                            Singleton<ObjManager>.Instance.MainPlayer.StopEffect(tabActLevel.EffectID);
                    }

                    if (GameManager.gameManager.AutoSearch != null)
                        GameManager.gameManager.AutoSearch.OnChangeScene(nLevel);
                    if (tabActLevel != null
                        && tabActLevel.SceneID != (int) GameDefine_Globe.SCENE_DEFINE.SCENE_LOGIN
                        && (tabTarLevel.OrgScene == 1 || tabActLevel.OrgScene == 1 || tabTarLevel.OrgScene == 2 ||
                            tabActLevel.OrgScene == 2)
                        && tabTarLevel.ResName == tabActLevel.ResName)
                    {
                        //原地切换的副本
                        var delayTime = GlobalEffectMgr.PlayCameraBlur();

                        GameManager.gameManager.ActiveScene.ClearUiBoard();
                        ObjManager.Instance.CleanSceneObj();
                        GameManager.gameManager.RunningScene = nLevel;
                        //GameManager.gameManager.PlayerDataPool.LoadSceneFinish();
                        MainUILogic.Instance().ChangeScene();
                        //Singleton<ObjManager>.GetInstance().MainPlayer.SetPosition(GameManager.gameManager.PlayerDataPool.EnterSceneCache.EnterScenePos);
                        //var serverID = GameManager.gameManager.PlayerDataPool.EnterSceneCache.EnterSceneServerID;
                        //ObjManager.Instance.AddPoolObj(ObjManager.Instance.MainPlayer);
                        //Singleton<ObjManager>.Instance.MainPlayer = Singleton<ObjManager>.GetInstance().MainPlayer;
                        //Singleton<ObjManager>.Instance.m_bBeginAsycCreateMainPlayer = true;
                        var mainPlayer = ObjManager.Instance.MainPlayer;
                        //mainPlayer.ChangeSceneSpecialOpt();
                        mainPlayer.SyncPlayerY();
                        var playerCombat = mainPlayer.GetComponent<AI_PlayerCombat>();
                        if (playerCombat != null)
                            playerCombat.LockAction();

                        if ((int) GameDefine_Globe.SCENE_DEFINE.SCENE_LOGIN != nLevel &&
                            GameManager.gameManager.SoundManager != null)
                            GameManager.gameManager.SoundManager.PlaySceneMusic();
                        GameManager.gameManager.RecoverNetDelay(delayTime);
                    }
                    //else if (tabActLevel.SceneID != (int)GameDefine_Globe.SCENE_DEFINE.SCENE_LOGIN
                    //    && actLevel == tabTarLevel.SceneID)
                    //{//同场景切换,掉线或换线 暂时复制原地副本逻辑
                    //    var delayTime = GlobalEffectMgr.PlayCameraBlur();

                    //    //GameManager.gameManager.ActiveScene.ClearUiBoard();
                    //    //ObjManager.Instance.CleanSceneObj();
                    //    GameManager.gameManager.RunningScene = nLevel;
                    //    //GameManager.gameManager.PlayerDataPool.LoadSceneFinish();
                    //    MainUILogic.Instance().ChangeScene();
                    //    GameManager.gameManager.SceneLogic.StartCoroutine(GameManager.gameManager.SceneLogic.ReLoadScene(delayTime * 0.3f));

                    //    var mainPlayer = ObjManager.Instance.MainPlayer;
                    //    //mainPlayer.ChangeSceneSpecialOpt();
                    //    mainPlayer.SyncPlayerY();
                    //    var playerCombat = mainPlayer.GetComponent<AI_PlayerCombat>();
                    //    if (playerCombat != null)
                    //        playerCombat.LockAction();

                    //    if ((int)GameDefine_Globe.SCENE_DEFINE.SCENE_LOGIN != nLevel &&
                    //        GameManager.gameManager.SoundManager != null)
                    //        GameManager.gameManager.SoundManager.PlaySceneMusic();
                    //}
                    else
                    {
                        LoadingWindow.LoadScene((GameDefine_Globe.SCENE_DEFINE) nLevel);
                    }
                }
                    break;
                //case GameDefine_Globe.EVENT_DEFINE.EVENT_QINGGONG:
                //    {
//              //           if (Singleton<ObjManager>.Instance.MainPlayer != null)
//              //           {
//              //               Singleton<ObjManager>.Instance.MainPlayer.BeginQingGong(_event);
//              //           }
                //        int nServerID = _event.GetIntParam(2);
                //        Obj obj = Singleton<ObjManager>.Instance.FindObjInScene(nServerID);
                //        if (obj)
                //        {
                //            if (obj.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_OTHER_PLAYER
                //                || obj.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER)
                //            {
                //                Obj_OtherPlayer OtherPlayer = obj as Obj_OtherPlayer;
                //                if (OtherPlayer)
                //                {
                //                    OtherPlayer.BeginQingGong(_event);
                //                }
                //            }
                //        }
                //    }
                //    break;
                case GameDefine_Globe.EVENT_DEFINE.EVENT_MISSION_ENTERAREA:
                {
                    GameManager.gameManager.MissionManager.missionEntreAreaCallBack();
                }
                    break;
                case GameDefine_Globe.EVENT_DEFINE.EVENT_KILLMONSTER:
                {
                    var mainPlayer = ObjManager.Instance.MainPlayer;
                    if (mainPlayer == null || !mainPlayer.isAutoCombat)
                        if (SkillBarLogic.Instance())
                            SkillBarLogic.Instance().OnDoAutoFightClick();
                }
                    break;
                case GameDefine_Globe.EVENT_DEFINE.EVENT_COLLECTITEM_RESEED:
                {
                    var nSceneID = _event.GetIntParam(0);
                    var nSceneIndex = _event.GetIntParam(1);
                    var nItemIndex = _event.GetIntParam(2);
                    if (Singleton<CollectItem>.GetInstance() != null)
                        Singleton<CollectItem>.GetInstance().ReSeedItems(nSceneID, nSceneIndex, nItemIndex);
                }
                    break;
                case GameDefine_Globe.EVENT_DEFINE.EVENT_ENTERAUNMOUNTCALLBACK:
                {
                    GameManager.gameManager.MissionManager.UnMountCallBack();
                }
                    break;
                case GameDefine_Globe.EVENT_DEFINE.EVENT_COLLECTUNMOUNTCALLBACK:
                {
                    GameManager.gameManager.MissionManager.MissionCollectItemUnMountCallBack();
                }
                    break;
                case GameDefine_Globe.EVENT_DEFINE.EVENT_CLICKCOLLECTITEMUNMOUNTCALLBACK:
                {
                    if (ProcessInput.Instance)
                        ProcessInput.Instance.ClickCollectItemUnMountCallBack(_event.GetFloatParam(0),
                            _event.GetFloatParam(1));
                }
                    break;
            }
        }
    }
}