using GFGGame;
using UnityEngine;
using System.Collections.Generic;
using System;
namespace GFGEditor
{
    /// 
    /// 配置表检查器:在有限范围内检查表格间关联的数据是否合法,并打印非法数据
    /// 
    public class ExcelChecker
    {
        public static void StartCheck()
        {
            CheckLuckyBoxCfg();
            CheckBonusListCfg();
            CheckDropOutCfg();
            CheckStoryChapterCfg();
            CheckStoryLevelCfg();
            CheckStoryFightCfg();
            CheckClothingShopCfg();
            CheckSuitCfg();
            CheckSuitGuideMenuCfg();
            CheckSuitSyntheticMenuCfg();
            CheckSuitSyntheticCfg();
            CheckClothingSyntheticCfg();
            CheckItemCfg();
            CheckCardStarCfg();
            CheckCardStoryCfg();
        }
        private static void CheckLuckyBoxCfg()
        {
            LuckyBoxCfgArray cfgArray = LuckyBoxCfgArray.Instance;
            LuckyBoxCfg[] dataArray = cfgArray.dataArray;
            foreach(LuckyBoxCfg boxCfg in dataArray)
            {
                CheckItemIdExist(boxCfg.costID, "抽奖LuckyBoxCfg.costID");
                foreach(int valueInt in boxCfg.bonusShowArr)
                {
                    CheckBonusExist(valueInt, "抽奖LuckyBoxCfg.bonusShow");
                }
            }
        }
        private static void CheckBonusListCfg()
        {
            BonusListCfgArray cfgArray = BonusListCfgArray.Instance;
            BonusListCfg[] dataArray = cfgArray.dataArray;
            foreach(BonusListCfg cfg in dataArray)
            {
                foreach(int[] values in cfg.bonusListArr)
                {
                    CheckItemIdExist(values[0], "抽奖BonusListCfg.bonusList");
                }
            }
        }
        private static void CheckDropOutCfg()
        {
            DropOutCfgArray cfgArray = DropOutCfgArray.Instance;
            DropOutCfg[] dataArray = cfgArray.dataArray;
            foreach(DropOutCfg cfg in dataArray)
            {
                if(cfg.item >= 10000000)//掉落id
                {
                    CheckDropOutExist(cfg.item, "掉落DropOutCfg.item");
                }
                else
                {
                    CheckItemIdExist(cfg.item, "掉落DropOutCfg.item");
                }
            }
        }
        private static void CheckStoryChapterCfg()
        {
            StoryChapterCfgArray cfgArray = StoryChapterCfgArray.Instance;
            StoryChapterCfg[] dataArray = cfgArray.dataArray;
            foreach(StoryChapterCfg cfg in dataArray)
            {
                CheckItemsExist(cfg.bonus1Arr, "剧情副本StoryChapterCfg.bonus1");
                CheckItemsExist(cfg.bonus2Arr, "剧情副本StoryChapterCfg.bonus2");
                CheckItemsExist(cfg.bonus3Arr, "剧情副本StoryChapterCfg.bonus3");
            }
        }
        private static void CheckStoryLevelCfg()
        {
            StoryLevelCfgArray cfgArray = StoryLevelCfgArray.Instance;
            StoryLevelCfg[] dataArray = cfgArray.dataArray;
            foreach(StoryLevelCfg cfg in dataArray)
            {
                CheckItemsExist(cfg.bonusOnceArr, "剧情副本StoryLevelCfg.bonusOnce");
                CheckStoryDialogExist(cfg.storyStartID, "剧情副本StoryLevelCfg.storyStartID");
                CheckStoryFightExist(cfg.fightID, "剧情副本StoryLevelCfg.fightID");
            }
        }
        private static void CheckStoryFightCfg()
        {
            StoryFightCfgArray cfgArray = StoryFightCfgArray.Instance;
            StoryFightCfg[] dataArray = cfgArray.dataArray;
            foreach(StoryFightCfg cfg in dataArray)
            {
                if(cfg.needSuitId > 0)
                {
                    CheckSuitExist(cfg.needSuitId, "剧情副本StoryFightCfg.needSuitId");
                }
                else if(cfg.needItemId > 0)
                {
                    CheckItemIdExist(cfg.needItemId, "剧情副本StoryFightCfg.needItemId");
                }
                CheckItemsExist(cfg.bonusBaseArr, "剧情副本StoryFightCfg.bonusBase");
                foreach(int value in cfg.bonusRandomArr)
                {
                    CheckDropOutExist(value, "剧情副本StoryFightCfg.bonusRandom");
                }
            }
        }
        private static void CheckClothingShopCfg()
        {
            ClothingShopCfgArray cfgArray = ClothingShopCfgArray.Instance;
            ClothingShopCfg[] dataArray = cfgArray.dataArray;
            foreach(ClothingShopCfg cfg in dataArray)
            {
                CheckItemIdExist(cfg.itemID, "商城ClothingShopCfg.itemID");
                CheckItemIdExist(cfg.costID, "商城ClothingShopCfg.costID");
            }
        }
        private static void CheckSuitCfg()
        {
            SuitCfgArray cfgArray = SuitCfgArray.Instance;
            SuitCfg[] dataArray = cfgArray.dataArray;
            foreach(SuitCfg suitCfg in dataArray)
            {
                CheckItemsExist(suitCfg.partsArr, "套装suitCfg.parts");
                CheckItemsExist(suitCfg.partsOptionalArr, "套装suitCfg.partsOptional");
            }
        }
        private static void CheckSuitGuideMenuCfg()
        {
            SuitGuideMenuCfgArray cfgArray = SuitGuideMenuCfgArray.Instance;
            SuitGuideMenuCfg[] dataArray = cfgArray.dataArray;
            foreach(SuitGuideMenuCfg cfg in dataArray)
            {
                if(cfg.suitIds.Length > 0)
                {
                    string[] values = cfg.suitIds.Split(';');
                    foreach(string value in values)
                    {
                        if(value.Length > 0)
                        {
                            int valueInt = int.Parse(value);
                            CheckSuitExist(valueInt, "图鉴SuitGuideMenuCfg.suitIds");
                        }
                    }
                }
            }
        }
        private static void CheckSuitSyntheticMenuCfg()
        {
            SuitSyntheticMenuCfgArray cfgArray = SuitSyntheticMenuCfgArray.Instance;
            SuitSyntheticMenuCfg[] dataArray = cfgArray.dataArray;
            foreach(SuitSyntheticMenuCfg cfg in dataArray)
            {
                if (cfg.suitIds.Length > 0)
                {
                    string[] values = cfg.suitIds.Split(';');
                    foreach (string value in values)
                    {
                        int valueInt = int.Parse(value);
                        CheckSuitExist(valueInt, "合成SuitSyntheticMenuCfg.suitIds");
                        CheckSuitSyntheticCfgExist(valueInt, "合成SuitSyntheticMenuCfg.suitIds");
                        CheckSuitClothingSyntheticCfgExist(valueInt, "合成SuitSyntheticMenuCfg.suitIds");
                    }
                }
            }
        }
        private static void CheckSuitSyntheticCfg()
        {
            SuitSyntheticCfgArray cfgArray = SuitSyntheticCfgArray.Instance;
            SuitSyntheticCfg[] dataArray = cfgArray.dataArray;
            foreach(SuitSyntheticCfg cfg in dataArray)
            {
                CheckStoryLevelCfgExist(cfg.storyLevelId, "合成SuitSyntheticCfg.storyLevelId");
                CheckSuitExist(cfg.preSuitId, "合成SuitSyntheticCfg.preSuitId");
                CheckItemsExist(cfg.boxBonus, "合成SuitSyntheticCfg.boxBonus");
            }
        }
        private static void CheckClothingSyntheticCfg()
        {
            ClothingSyntheticCfgArray cfgArray = ClothingSyntheticCfgArray.Instance;
            ClothingSyntheticCfg[] dataArray = cfgArray.dataArray;
            foreach(ClothingSyntheticCfg cfg in dataArray)
            {
                CheckItemIdExist(cfg.costID, "合成ClothingSyntheticCfg.costID");
                CheckItemsExist(cfg.materiars, "合成ClothingSyntheticCfg.materiars");
            }
        }
        private static void CheckItemCfg()
        {
            ItemCfgArray cfgArray = ItemCfgArray.Instance;
            ItemCfg[] dataArray = cfgArray.dataArray;
            foreach(ItemCfg cfg in dataArray)
            {
                if (cfg.resLayer1 == 0 && cfg.resLayer2 == 0 && ItemUtil.IsDressUpItem(cfg.id))
                {
                    throw (new Exception("物品" + cfg.id + "没有配置显示层"));
                }
            }
        }
        //=====================================================================================================
        private static void CheckItemIdExist(int id, string keyName)
        {
            if(id > 0)
            {
                ItemCfgArray cfgArray = ItemCfgArray.Instance;
                ItemCfg itemCfg = cfgArray.GetCfg(id);
                if(itemCfg == null)
                {
                    Debug.LogErrorFormat("{0}配置的物品{1}不存在", new object[]{keyName, id} );
                }
            }
        }
        private static void CheckItemsExist(string itemsStr, string keyName)
        {
            string[] itemInfos = itemsStr.Split(';');
            foreach(string itemInfo in itemInfos)
            {
                if(itemInfo.Length > 0)
                {
                    string[] itemValues = itemInfo.Split('*');
                    CheckItemIdExist(int.Parse(itemValues[0]), keyName);
                }
            }
        }
        private static void CheckItemsExist(int[] items, string keyName)
        {
            foreach (int itemId in items)
            {
                CheckItemIdExist(itemId, keyName);
            }
        }
        private static void CheckItemsExist(int[][] items, string keyName)
        {
            foreach (int[] itemInfo in items)
            {
                CheckItemIdExist(itemInfo[0], keyName);
            }
        }
        private static void CheckBonusExist(int id, string keyName)
        {
            BonusListCfgArray cfgArray = BonusListCfgArray.Instance;
            BonusListCfg cfg = cfgArray.GetCfg(id);
            if(cfg == null)
            {
                Debug.LogErrorFormat("{0}配置的奖励{1}不存在", new object[]{keyName, id} );
            }
        }
        private static void CheckStoryDialogExist(string id, string keyName)
        {
            if(id.Length > 0)
            {
                StoryDialogCfgArray cfgArray = StoryDialogCfgArray.Instance;
                StoryDialogCfg[] cfg = cfgArray.GetCfgs(id);
                if(cfg == null && cfg.Length > 0)
                {
                    Debug.LogErrorFormat("{0}配置的对话{1}不存在", new object[]{keyName, id} );
                }
            }
        }
        private static void CheckStoryFightExist(string id, string keyName)
        {
            if(id.Length > 0)
            {
                StoryFightCfgArray cfgArray = StoryFightCfgArray.Instance;
                StoryFightCfg cfg = cfgArray.GetCfg(id);
                if(cfg == null)
                {
                    Debug.LogErrorFormat("{0}配置的战斗{1}不存在", new object[]{keyName, id} );
                }
            }
        }
        private static void CheckDropOutExist(int id, string keyName)
        {
            var arr = DropOutCfgArray.Instance.GetCfgs(id);
            List dropOutCfgs = new List(arr);
            if(dropOutCfgs == null || dropOutCfgs.Count <= 0)
            {
                Debug.LogErrorFormat("{0}配置的掉落{1}不存在", new object[]{keyName, id} );
            }
        }
        private static void CheckSuitExist(int id, string keyName)
        {
            if(id > 0)
            {
                SuitCfgArray cfgArray = SuitCfgArray.Instance;
                SuitCfg cfg = cfgArray.GetCfg(id);
                if(cfg == null)
                {
                    Debug.LogErrorFormat("{0}配置的套装{1}不存在", new object[]{keyName, id} );
                }
            }
        }
        private static void CheckSuitSyntheticCfgExist(int id, string keyName)
        {
            if(id > 0)
            {
                SuitSyntheticCfgArray cfgArray = SuitSyntheticCfgArray.Instance;
                SuitSyntheticCfg cfg = cfgArray.GetCfg(id);
                if (cfg == null)
                {
                    Debug.LogFormat("{0}配置的套装{1}没有对应的合成解锁配置", new object[] { keyName, id });
                }
            }
        }
        private static void CheckSuitClothingSyntheticCfgExist(int id, string keyName)
        {
            if (id > 0)
            {
                SuitCfgArray cfgArray = SuitCfgArray.Instance;
                SuitCfg cfg = cfgArray.GetCfg(id);
                int[] itemInfos = cfg.partsArr;
                foreach (int itemId in itemInfos)
                {
                    keyName = string.Format("{0}配置的套装{1}必含部件", keyName, id);
                    CheckClothingSyntheticCfgExist(itemId, keyName);
                }
            }
        }
        private static void CheckClothingSyntheticCfgExist(int id, string keyName)
        {
            if(id > 0)
            {
                ClothingSyntheticCfgArray cfgArray = ClothingSyntheticCfgArray.Instance;
                ClothingSyntheticCfg cfg = cfgArray.GetCfg(id);
                if (cfg == null)
                {
                    Debug.LogErrorFormat("{0}配置的服装{1}没有对应的合成消耗配置", new object[] { keyName, id });
                }
            }
        }
        private static void CheckStoryLevelCfgExist(string id, string keyName)
        {
            if(id.Length > 0)
            {
                StoryLevelCfgArray cfgArray = StoryLevelCfgArray.Instance;
                StoryLevelCfg cfg = cfgArray.GetCfg(id);
                if(cfg == null)
                {
                    Debug.LogErrorFormat("{0}配置的关卡{1}不存在", new object[] { keyName, id });
                }
            }
        }
        private static void CheckCardStarCfg()
        {
            CardStarCfgArray cfgArray = CardStarCfgArray.Instance;
           CardStarCfg [] dataArray = cfgArray.dataArray;
            foreach (CardStarCfg cfg in dataArray)
            {
                CheckItemsExist(cfg.materiarsArr, "卡牌CardStarCfg.materiars");
            }
        }
        private static void CheckCardStoryCfg()
        {
            CardStoryCfgArray cfgArray = CardStoryCfgArray.Instance;
            CardStoryCfg[] dataArray = cfgArray.dataArray;
            foreach (CardStoryCfg cfg in dataArray)
            {
                CheckStoryDialogExist(cfg.storyStartID, "卡牌CardStoryCfg.storyStartID");
            }
        }
    }
}