//--------------------------------------------------------  
 | 
//    [Author]:           第二世界  
 | 
//    [  Date ]:           Tuesday, October 31, 2017  
 | 
//--------------------------------------------------------  
 | 
  
 | 
using System;  
 | 
using System.Collections;  
 | 
using System.Collections.Generic;  
 | 
using UnityEngine;  
 | 
using UnityEngine.UI;  
 | 
  
 | 
  
 | 
namespace Snxxz.UI  
 | 
{  
 | 
  
 | 
    public class ElderGodAreaWin : Window  
 | 
    {  
 | 
        [SerializeField] CyclicScroll m_Bosses;  
 | 
        [SerializeField] ElderEliteMonsterBehaviour m_EliteMonsterBehaviour;  
 | 
        [SerializeField] BossIntroduceBehaviour m_BossIntroduce;  
 | 
        [SerializeField] Text m_Times;  
 | 
        [SerializeField] Button m_Goto;  
 | 
        [SerializeField] Button m_KillRecord;  
 | 
        [SerializeField] ToggleButton m_Subscribe;  
 | 
        [SerializeField] RectTransform m_NoDamageTip;  
 | 
  
 | 
        ElderGodAreaModel model { get { return ModelCenter.Instance.GetModel<ElderGodAreaModel>(); } }  
 | 
        FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }  
 | 
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }  
 | 
  
 | 
        #region Built-in  
 | 
        protected override void BindController()  
 | 
        {  
 | 
        }  
 | 
  
 | 
        protected override void AddListeners()  
 | 
        {  
 | 
            m_Goto.AddListener(GotoKillBoss);  
 | 
            m_KillRecord.AddListener(ShowKillRecords);  
 | 
            m_Subscribe.AddListener(SwitchSubscribeBoss);  
 | 
        }  
 | 
  
 | 
        protected override void OnPreOpen()  
 | 
        {  
 | 
            var enterTimes = dungeonModel.GetEnterTimes(ElderGodAreaModel.ELDERGODAREA_MAPID);  
 | 
            var totalTimes = dungeonModel.GetTotalTimes(ElderGodAreaModel.ELDERGODAREA_MAPID);  
 | 
            m_Times.text = Language.Get("Dungeon_LeavingTimes", totalTimes - enterTimes);  
 | 
        }  
 | 
  
 | 
        protected override void OnAfterOpen()  
 | 
        {  
 | 
            model.bossSelectedEvent += OnBossSelected;  
 | 
            findPreciousModel.bossSubscribeChangeEvent += OnSubscribeBoss;  
 | 
        }  
 | 
  
 | 
        protected override void OnPreClose()  
 | 
        {  
 | 
            StopAllCoroutines();  
 | 
            model.bossSelectedEvent -= OnBossSelected;  
 | 
            findPreciousModel.bossSubscribeChangeEvent -= OnSubscribeBoss;  
 | 
        }  
 | 
  
 | 
        protected override void OnAfterClose()  
 | 
        {  
 | 
        }  
 | 
  
 | 
        protected override void OnActived()  
 | 
        {  
 | 
            base.OnActived();  
 | 
            ShowBosses();  
 | 
            CheckAchievementGuide();  
 | 
        }  
 | 
  
 | 
        #endregion  
 | 
  
 | 
        private void ShowBosses()  
 | 
        {  
 | 
            var bosses = new List<int>();  
 | 
            bosses.AddRange(model.GetElderGodNpces());  
 | 
            model.selectedBoss = model.GetRecommendNpc();  
 | 
  
 | 
            m_Bosses.Init(bosses);  
 | 
            m_Bosses.MoveToCenter(bosses.IndexOf(model.selectedBoss));  
 | 
  
 | 
            DisplayGotoKillButton(model.selectedBoss);  
 | 
            DisplaySubscribe(model.selectedBoss);  
 | 
            DisplayNpcBaseInfo(true);  
 | 
            DisplayTip(model.selectedBoss);  
 | 
        }  
 | 
  
 | 
        private void ShowKillRecords()  
 | 
        {  
 | 
            ModelCenter.Instance.GetModel<FindPreciousModel>().ViewKillRecordsBoss = model.selectedBoss;  
 | 
            WindowCenter.Instance.Open<KillRecordsWin>();  
 | 
        }  
 | 
  
 | 
        private void GotoKillBoss()  
 | 
        {  
 | 
            var error = 0;  
 | 
            if (TestEnterDungeon(out error))  
 | 
            {  
 | 
                DungeonSuppliesLackWin.lackType = DungeonSuppliesLackWin.LackType.ElderGodArea;  
 | 
                WindowCenter.Instance.Open<DungeonSuppliesLackWin>();  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                switch (error)  
 | 
                {  
 | 
                    case 1:  
 | 
                        SysNotifyMgr.Instance.ShowTip("ElderGodNoTimes");  
 | 
                        break;  
 | 
                    case 2:  
 | 
                        WindowCenter.Instance.Close<FindPreciousFrameWin>();  
 | 
                        var config = ElderGodAreaConfig.Get(model.selectedBoss);  
 | 
                        var targetNpc = config.MonsterType == 1 ? model.GetRecommendEliteNpc() : model.selectedBoss;  
 | 
                        MapTransferUtility.Instance.MoveToNPC(targetNpc);  
 | 
                        break;  
 | 
                    case 3:  
 | 
                        SysNotifyMgr.Instance.ShowTip("DungeonNoGO");  
 | 
                        break;  
 | 
                    case 4:  
 | 
                        SysNotifyMgr.Instance.ShowTip("BossRealmHint2", RealmConfig.Get(NPCConfig.Get(model.selectedBoss).Realm).LvLarge);  
 | 
                        break;  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private bool TestEnterDungeon(out int _error)  
 | 
        {  
 | 
            var config = ElderGodAreaConfig.Get(model.selectedBoss);  
 | 
            if (config.MonsterType == 2 && !findPreciousModel.IsBossUnlock(model.selectedBoss))  
 | 
            {  
 | 
                _error = 4;  
 | 
                return false;  
 | 
            }  
 | 
  
 | 
            var dataMapId = dungeonModel.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID);  
 | 
            if (dataMapId == ElderGodAreaModel.ELDERGODAREA_MAPID)  
 | 
            {  
 | 
                _error = 2;  
 | 
                return false;  
 | 
            }  
 | 
  
 | 
            var enterTimes = dungeonModel.GetEnterTimes(ElderGodAreaModel.ELDERGODAREA_MAPID);  
 | 
            var totalTimes = dungeonModel.GetTotalTimes(ElderGodAreaModel.ELDERGODAREA_MAPID);  
 | 
            if (enterTimes >= totalTimes)  
 | 
            {  
 | 
                _error = 1;  
 | 
                return false;  
 | 
            }  
 | 
  
 | 
            var mapConfig = MapConfig.Get(PlayerDatas.Instance.baseData.MapID);  
 | 
            if (mapConfig.MapFBType != (int)MapType.OpenCountry && PlayerDatas.Instance.baseData.MapID != 31020)  
 | 
            {  
 | 
                _error = 3;  
 | 
                return false;  
 | 
            }  
 | 
  
 | 
            _error = 0;  
 | 
            return true;  
 | 
        }  
 | 
  
 | 
        private void SwitchSubscribeBoss()  
 | 
        {  
 | 
            if (findPreciousModel.IsBossSubscribed(model.selectedBoss))  
 | 
            {  
 | 
                findPreciousModel.RequestDeSubscribeBoss(model.selectedBoss);  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                findPreciousModel.RequestSubscribeBoss(model.selectedBoss, false);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void OnSubscribeBoss(int _bossId)  
 | 
        {  
 | 
            m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(model.selectedBoss);  
 | 
        }  
 | 
  
 | 
        private void OnBossSelected(int bossId)  
 | 
        {  
 | 
            StopCoroutine("Co_DelayDisplayNpcBaseInfo");  
 | 
            StartCoroutine("Co_DelayDisplayNpcBaseInfo");  
 | 
        }  
 | 
  
 | 
        private void DisplayNpcBaseInfo(bool immediately)  
 | 
        {  
 | 
            var npcId = model.selectedBoss;  
 | 
            var config = ElderGodAreaConfig.Get(npcId);  
 | 
            switch (config.MonsterType)  
 | 
            {  
 | 
                case 1:  
 | 
                    m_KillRecord.SetActive(false);  
 | 
                    m_BossIntroduce.SetActive(false);  
 | 
                    m_EliteMonsterBehaviour.SetActive(true);  
 | 
                    m_EliteMonsterBehaviour.Display(npcId);  
 | 
                    break;  
 | 
                case 2:  
 | 
                    m_KillRecord.SetActive(true);  
 | 
                    m_BossIntroduce.SetActive(true);  
 | 
                    m_EliteMonsterBehaviour.SetActive(false);  
 | 
                    m_BossIntroduce.Display(npcId, immediately);  
 | 
                    break;  
 | 
                default:  
 | 
                    break;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        IEnumerator Co_DelayDisplayNpcBaseInfo()  
 | 
        {  
 | 
            yield return WaitingForSecondConst.WaitMS300;  
 | 
  
 | 
            DisplayGotoKillButton(model.selectedBoss);  
 | 
            DisplaySubscribe(model.selectedBoss);  
 | 
            DisplayTip(model.selectedBoss);  
 | 
            DisplayNpcBaseInfo(true);  
 | 
        }  
 | 
  
 | 
        private void CheckAchievementGuide()  
 | 
        {  
 | 
            if (AchievementGoto.guideAchievementId != 0)  
 | 
            {  
 | 
                var config = SuccessConfig.Get(AchievementGoto.guideAchievementId);  
 | 
                var condition = config.Type == 37 && config.Condition[0] == ElderGodAreaModel.ELDERGODAREA_MAPID;  
 | 
                condition = condition || (config.Type == 4);  
 | 
                if (condition)  
 | 
                {  
 | 
                    var guideEffect = AchievementGuideEffectPool.Require(1);  
 | 
                    guideEffect.transform.SetParentEx(m_Goto.transform, Vector3.zero, Vector3.zero, Vector3.one);  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void DisplayTip(int bossId)  
 | 
        {  
 | 
            if (!findPreciousModel.IsBossUnlock(bossId))  
 | 
            {  
 | 
                m_NoDamageTip.SetActive(true);  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                m_NoDamageTip.SetActive(false);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void DisplayGotoKillButton(int bossId)  
 | 
        {  
 | 
        }  
 | 
  
 | 
        private void DisplaySubscribe(int bossId)  
 | 
        {  
 | 
            var isUnLocked = findPreciousModel.IsBossUnlock(bossId);  
 | 
            m_Subscribe.SetActive(isUnLocked);  
 | 
            if (isUnLocked)  
 | 
            {  
 | 
                m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(bossId);  
 | 
            }  
 | 
        }  
 | 
  
 | 
    }  
 | 
  
 | 
}  
 | 
  
 |