using CommonAI.Zone;
using CommonAI.Zone.Instance;
using CommonAI.Zone.ZoneEditor;
using CommonLang;
using CommonLang.IO;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using XmdsCommon.EditorData;
using XmdsCommon.Plugin;
using XmdsCommonServer.XLS;
using XmdsCommonServer.XLS.Data;

namespace XmdsCommonServer.Plugin
{
    /// <summary>
    /// FileName: XmdsDataMgr.cs
    /// Author: Alex.Yu
    /// Corporation:... 
    /// Description: Xmds配置数据管理类.
    /// DateTime: 2015/7/7 18:35:41
    /// </summary>
    public class XmdsDataMgr
    {
        private static XmdsDataMgr mInstance = null;
        private XLSMonsterDataLoader mMonsterDataLoader = null;
        public XLSMonsterDynamicLoader mMonsterDynamicLoader = null;
        private XLSSkillCfgLoader mXLSSkillCfgLoader = null;
        private XLSNPCDataLoader mXLSNPCDataLoader = null;
        private XLSRandomMonsterSkillLoader mXLSRandomMonsterskillLoader = null;
        private XLSBSConfigLoader mXLSBSConfigLoader = null;

		//buff配置表
		private XLSBuffConfigLoader mXLSBuffConfigLoader = null;

		//随机名字
		private XLSRandomNameLoader mXLSRandomNameLoader = null;

		private XLSZhanYaoDataLoader mXLSZhanYaoDataLoader = null;
		//场景,山大王对应配置
		private XLSMountainKingConfigLoader mMountainKingConfigLoader = null;

		private XmdsDataMgr()
        {
            mInstance = this;
        }

        public static XmdsDataMgr GetInstance()
        {
            if ( mInstance == null )
            {
                new XmdsDataMgr();
            }

            return mInstance;
        }

        #region 怪物能力配置.

        /// <summary>
        /// 加载怪物配置数据.
        /// </summary>
        /// <param name="path"></param>
        public void LoadMonsterData(string path)
        {
            Stopwatch sw = Stopwatch.StartNew();
            mMonsterDataLoader = new XLSMonsterDataLoader(path);
            sw.Stop();
            XmdsVirtual.FormatLog("LoadMonsterData usetime {0}", sw.ElapsedMilliseconds);
        }

        public void LoadMonsterDynamicData(string path)
        {
            Stopwatch sw = Stopwatch.StartNew();
            mMonsterDynamicLoader = new XLSMonsterDynamicLoader(path);
            sw.Stop();
            XmdsVirtual.FormatLog("LoadMonsterDynamicData usetime {0}", sw.ElapsedMilliseconds);
        }



		public void LoadMountainKingData(string path)
		{
			Stopwatch sw = Stopwatch.StartNew();
			mMountainKingConfigLoader = new XLSMountainKingConfigLoader(path);
			sw.Stop();
			XmdsVirtual.FormatLog("LoadMountainKingData usetime {0}", sw.ElapsedMilliseconds);
		}

		/// <summary>
		/// 获取怪物能力.
		/// </summary>
		/// <param name="sceneType"></param>
		/// <param name="tempID"></param>
		/// <param name="random"></param>
		/// <param name="needFormat"></param>
		/// <returns></returns>
		public MonsterData GetMonsterData(string sceneType, int tempID, Random random, bool needFormat = true)
        {
            MonsterData ret = null;

            if ( mMonsterDataLoader != null )
            {
                ret = mMonsterDataLoader.GetMonsterAbility(sceneType, tempID, random,needFormat);
            }

            return ret;
        }

        public MonsterProp GetSingleMonsterProp(int level,int type)
        {
            MonsterProp ret = null;
            if (mMonsterDynamicLoader != null)
            {
                ret = mMonsterDynamicLoader.GetSingleMonsterProp(level,type);
            }
            return ret;
        }
        public MonsterProp GetMultipleMonsterProp(int level, int type)
        {
            MonsterProp ret = null;
            if (mMonsterDynamicLoader != null)
            {
                ret = mMonsterDynamicLoader.GetMultipleMonsterProp(level, type);
            }
            return ret;
        }
        public OrigData GetOrigData(int level)
        {
            OrigData ret = null;
            if (mMonsterDynamicLoader != null)
            {
                ret = mMonsterDynamicLoader.GetOrigData(level);
            }
            return ret;
        }

        public TowerMonsterRatio GetTowerMonsterRatio(int floor)
        {
            TowerMonsterRatio ret = null;
            if (mMonsterDynamicLoader != null)
            {
                ret = mMonsterDynamicLoader.GetTowerMonsterRatio(floor);
            }
            return ret;
        }

        public TowerMonsterRatio GetAbyssMonsterRatio(int floor)
        {
            TowerMonsterRatio ret = null;
            if (mMonsterDynamicLoader != null)
            {
                ret = mMonsterDynamicLoader.GetAbyssMonsterRatio(floor);
            }
            return ret;
        }

        public GuildBossRatio GetGuildBossRatio(int bossLv)
        {
            GuildBossRatio ret = null;
            if (mMonsterDynamicLoader != null)
            {
                ret = mMonsterDynamicLoader.GetGuildBossRatio(bossLv);
            }
            return ret;
        }

        public UserDefineConfig GetUserDefineConfig(int type)
        {
            UserDefineConfig ret = null;
            if (mMonsterDynamicLoader != null)
            {
                ret = mMonsterDynamicLoader.GetUserDefineConfig(type);
            }
            return ret;
        }
        public DungeonMonsterRatio GetDungeonMonsterRatio(int type)
        {
            DungeonMonsterRatio ret = null;
            if (mMonsterDynamicLoader != null)
            {
                ret = mMonsterDynamicLoader.GetDungeonMonsterRatio(type);
            }
            return ret;
        }
        

        public MonsterData GetSummonMonsterData(string sceneType, int tempID, int lv, Random random)
        {
            MonsterData ret = null;

            if (mMonsterDataLoader != null)
            {
                ret = mMonsterDataLoader.GetSummonMonsterAbility(sceneType, tempID, lv, random);
            }

            return ret;
        }

        #endregion

        #region 技能数据配置.

        public void LoadSkillCfgData(string path)
        {
            Stopwatch sw = Stopwatch.StartNew();
            mXLSSkillCfgLoader = new XLSSkillCfgLoader(path);
            sw.Stop();
            XmdsVirtual.FormatLog("LoadSkillCfgData usetime {0}", sw.ElapsedMilliseconds);
        }

		public void LoadBuffCfgData(string path)
		{
			Stopwatch sw = Stopwatch.StartNew();
			mXLSBuffConfigLoader = new XLSBuffConfigLoader(path);
			sw.Stop();
			XmdsVirtual.FormatLog("LoadBuffCfgData usetime {0}", sw.ElapsedMilliseconds);
		}

		public void LoadRandomNameData(string path)
		{
			Stopwatch sw = Stopwatch.StartNew();
			mXLSRandomNameLoader = new XLSRandomNameLoader(path);
			sw.Stop();
			XmdsVirtual.FormatLog("LoadBuffCfgData usetime {0}", sw.ElapsedMilliseconds);
		}

		public XmdsSkillData GetXmdsSkillData(int skillid)
        {
            XmdsSkillData ret = null;

            if ( mXLSSkillCfgLoader != null )
            {
                ret = mXLSSkillCfgLoader.GetSkillData(skillid);
            }

            return ret;
        }

		public BuffConfig GetBuffConfigData(int triggerID)
		{
			if (mXLSBuffConfigLoader != null)
			{
				return mXLSBuffConfigLoader.GetBuffData(triggerID);
			}

			return null;
		}

		public HashMap<int, BuffConfig> GetBuffConfigDatas()
		{
			if (mXLSBuffConfigLoader != null)
			{
				return mXLSBuffConfigLoader.GetAllDatas();
			}

			return null;
		}


		#endregion

		#region NPC数据配置.

		public void LoadNPCData(string path)
        {
            Stopwatch sw = Stopwatch.StartNew();
            mXLSNPCDataLoader = new XLSNPCDataLoader(path);
            sw.Stop();
            XmdsVirtual.FormatLog("LoadNPCData usetime {0}", sw.ElapsedMilliseconds);
        }

		public NPCData GetNPCData(int templateID, int lv)
        {
            NPCData ret = null;

            if ( mXLSNPCDataLoader != null )
            {
                ret = mXLSNPCDataLoader.GetNPCAbility(templateID, lv);
            }

            return ret;
        }


		public void LoadZhanYaoData(string path)
		{
			Stopwatch sw = Stopwatch.StartNew();
			mXLSZhanYaoDataLoader = new XLSZhanYaoDataLoader(path);
			sw.Stop();
			XmdsVirtual.FormatLog("LoadNPCData usetime {0}", sw.ElapsedMilliseconds);
		}

		public bool IsZhanYaoCrit(InstanceUnit unit, int bossLevel, int level, int curHitNums, ref int outStateExt)
		{
			ZhanYaoData data = mXLSZhanYaoDataLoader.GetZhanYaoData(level);
			if(data == null || bossLevel > data.Zhanyao_Data1)
			{
				return false;
			}

			outStateExt = data.Zhanyao_CHD;
			if (data.Zhanyao_maxtime >= 0 && curHitNums >= data.Zhanyao_maxtime)
			{
                return true;
			}
			else if (unit.RandomN.Next(10000) < data.Zhanyao_CHC)
			{
				return true;
			}

			return false;
        }

        public void LoadMonsterSkillInfo(String path)
        {
            Stopwatch sw = Stopwatch.StartNew();
            mXLSRandomMonsterskillLoader = new XLSRandomMonsterSkillLoader(path);
            sw.Stop();
            XmdsVirtual.FormatLog("LoadNPCData usetime {0}", sw.ElapsedMilliseconds);
        }

        public void LoadBSConfig(String path)
        {
            Stopwatch sw = Stopwatch.StartNew();
            mXLSBSConfigLoader = new XLSBSConfigLoader(path);
            sw.Stop();
            XmdsVirtual.FormatLog("LoadBSConfig usetime {0}", sw.ElapsedMilliseconds);
        }

        public MonsterSkills GetMonsterSkillInfo(int monsterId)
        {
            MonsterSkills ret = null;

            if (mXLSRandomMonsterskillLoader != null)
            {
                ret = mXLSRandomMonsterskillLoader.GetMonsterSkillInfo(monsterId);
            }

            return ret;
        }

        public MonsterSkills GetMonsterSkillInfo()
        {
            return mXLSRandomMonsterskillLoader.GetMonsterSkillInfo();
        }

        //获得boss随机主动技能数
        public int GetBossComActiveNum()
        {
            return this.mXLSSkillCfgLoader.GetBossComActiveNum();
        }

        //获得boss被动技能数
        public int GetBossComPassiveNum()
        {
            return this.mXLSSkillCfgLoader.GetBossComPassiveNum();
        }

        //随机获得一个boss主动技能
        public XmdsSkillData GetBossRandomActiveSkill(Random random)
        {
            return this.mXLSSkillCfgLoader.GetBossRandomActiveSkill(random);
        }


        //随机获得一个boss被动技能
        public XmdsSkillData GetBossRandomPassiveSkill(Random random, XmdsSkillData[] hasList)
        {
            return this.mXLSSkillCfgLoader.GetBossRandomPassiveSkill(random, hasList);
        }

        //多人深渊秘境,怪物数值加成
        public AbyssMutilAddition GetAbyssMutilAddition()
        {
            return this.mXLSBSConfigLoader.GetMutilAbyssAddition();
        }

		public string GetRanomName()
		{
			return this.mXLSRandomNameLoader.GetRanomName();
		}

		/** 获取一个地图的王 */
		public int GetMapKingID(int mapID)
		{
			return this.mMountainKingConfigLoader == null ? 0 : this.mMountainKingConfigLoader.GetMapKing(mapID);
		}

		/** 获得山大王列表 */
		public HashSet<int> GetMountainKings()
		{
			return this.mMountainKingConfigLoader.GetMountainKings();
		}

        #endregion
    }
}