using System.Collections.Generic;
using UnityEngine;
using GFGGame;
using System;
namespace GFGEditor
{
    /// 
    /// 物品获取途径扫描器:扫描获取途径,并填入物品表的获取途径字段
    /// 
    public class ItemApproachScanner
    {
        private delegate string GetApproachCall(int itemId);
        public static void startScan()
        {
            ItemCfgArray itemManager = ItemCfgArray.Instance;
            if (itemManager != null)
            {
                ItemCfg[] dataArray = itemManager.dataArray;
                GetApproachCall[] actions = new GetApproachCall[] { GetClothingShopApproach, GetZhaiXingApproach, GetStoryLevelApproach, GetClothingSyntheticApproach, GetSuitGuideApproach, GetSuitSyntheticApproach };
                foreach (ItemCfg cfg in dataArray)
                {
                    //HandleItemType(cfg);
                    HandleItemApproch(cfg, actions);
                }
                SQLiteHelper.Instance.OpenConnection();
                try
                {
                    foreach (ItemCfg cfg in dataArray)
                    {
                        var names = new string[] { "_" + nameof(cfg.subType), "_" + nameof(cfg.itemType), "_" + nameof(cfg.approach) };
                        var values = new string[] { "" + cfg.subType, "" + cfg.itemType, "" + cfg.approach };
                        SQLiteHelper.Instance.UpdateValues(nameof(ItemCfgArray), names, values, "_" + nameof(cfg.id), "=", cfg.id.ToString());
                    }
                }
                catch (Exception e)
                {
                    throw (e);
                }
                finally
                {
                    SQLiteHelper.Instance.CloseConnection();
                }
            }
        }
        private static void HandleItemApproch(ItemCfg cfg, GetApproachCall[] actions)
        {
            List approachs = new List();
            foreach (GetApproachCall action in actions)
            {
                string tempApproach = action(cfg.id);
                if (tempApproach != null)
                {
                    approachs.Add(tempApproach);
                }
            }
            if (approachs.Count > 0)
            {
                string approach = string.Join(";", approachs);
                cfg.approach = approach;
                if (approachs.Count > 5)
                {
                    Debug.LogFormat("物品{0}的获取途径为 {1}", cfg.name, approach);
                }
            }
            else
            {
                if (cfg.id < 1000000 || cfg.id >= 2000000)
                {
                    if ((!cfg.name.Contains("原始") && !cfg.name.Contains("默认")) || cfg.id >= 1000000)
                    {
                        Debug.LogErrorFormat("物品 {0} {1} 没有获取途径", cfg.id, cfg.name);
                    }
                }
            }
        }
        /// 
        /// 尝试获取服装店产出途径
        /// 
        /// 
        /// 
        private static string GetClothingShopApproach(int itemId)
        {
            ClothingShopCfgArray manager = ClothingShopCfgArray.Instance;
            ClothingShopCfg[] dataArray = manager.dataArray;
            foreach (ClothingShopCfg cfg in dataArray)
            {
                if (cfg.itemID == itemId)
                {
                    return "FU_ZHUANG_DIAN";
                }
            }
            return null;
        }
        /// 
        /// 尝试获取摘星(抽奖)产出途径
        /// 
        /// 
        /// 
        private static string GetZhaiXingApproach(int itemId)
        {
            LuckyBoxCfgArray manager = LuckyBoxCfgArray.Instance;
            LuckyBoxCfg[] dataArray = manager.dataArray;
            if (itemId == 10090)
            {
                Debug.Log("");
            }
            foreach (LuckyBoxCfg cfg in dataArray)
            {
                int dropId = cfg.bonus;
                bool approach = CheckDropApproach(itemId, dropId);
                if (approach)
                {
                    return "ZHAI_XING";
                }
            }
            return null;
        }
        /// 
        /// 尝试获取剧情关卡产出途径
        /// 
        /// 
        /// 
        private static string GetStoryLevelApproach(int itemId)
        {
            List approachs = new List();
            StoryLevelCfgArray manager = StoryLevelCfgArray.Instance;
            StoryLevelCfg[] dataArray = manager.dataArray;
            foreach (StoryLevelCfg cfg in dataArray)
            {
                bool result = CheckItemInBonus(itemId, cfg);
                if (result)
                {
                    string approach = "JU_QING_GUAN_QIA=" + cfg.id;
                    approachs.Add(approach);
                }
            }
            if (approachs.Count > 0)
            {
                return string.Join(";", approachs);
            }
            return null;
        }
        /// 
        /// 尝试获取服装合成产出途径
        /// 
        /// 
        /// 
        private static string GetClothingSyntheticApproach(int itemId)
        {
            SuitSyntheticMenuCfgArray manager = SuitSyntheticMenuCfgArray.Instance;
            SuitSyntheticMenuCfg[] dataArray = manager.dataArray;
            foreach (SuitSyntheticMenuCfg cfg in dataArray)
            {
                int suitId = CheckItemInSuit(itemId, cfg.suitIds);
                if (suitId > 0)
                {
                    return "FU_ZHUANG_HE_CHENG=" + suitId;
                }
            }
            return null;
        }
        private static string GetSuitGuideApproach(int itemId)
        {
            SuitCfgArray manager = SuitCfgArray.Instance;
            SuitCfg[] dataArray = manager.dataArray;
            foreach (SuitCfg cfg in dataArray)
            {
                bool result = CheckItemInBonus(itemId, cfg.boxBonusArr);
                if (result)
                {
                    return "TAO_ZHUANG_TU_JIAN";
                }
            }
            return null;
        }
        private static string GetSuitSyntheticApproach(int itemId)
        {
            SuitSyntheticCfgArray manager = SuitSyntheticCfgArray.Instance;
            SuitSyntheticCfg[] dataArray = manager.dataArray;
            foreach (SuitSyntheticCfg cfg in dataArray)
            {
                bool result = CheckItemInBonus(itemId, cfg.boxBonus);
                if (result)
                {
                    return "TAO_ZHUANG_HE_CHENG";
                }
            }
            return null;
        }
        /// 
        /// 检测掉落表是否产出该物品
        /// 
        /// 
        /// 
        private static bool CheckDropApproach(int itemId, int dropId)
        {
            DropOutCfgArray manager = DropOutCfgArray.Instance;
            DropOutCfg[] dataArray = manager.GetCfgs(dropId);
            for (int i = 0; i < dataArray.Length; i++)
            {
                if (dataArray[i].item == itemId)
                {
                    return true;
                }
                if (manager.GetCfgs(dataArray[i].item).Length > 0)
                {
                    return CheckDropApproach(itemId, dataArray[i].item);
                }
            }
            return false;
        }
        private static bool CheckItemInBonus(int itemId, StoryLevelCfg cfg)
        {
            if (cfg.fightID.Length > 0)
            {
                StoryFightCfgArray manager = StoryFightCfgArray.Instance;
                StoryFightCfg storyFightCfg = manager.GetCfg(cfg.fightID);
                List a = new List();
                a.AddRange(cfg.bonusOnceArr);
                a.AddRange(storyFightCfg.bonusBaseArr);
                int[][] bonus = a.ToArray();
                bool result = CheckItemInBonus(itemId, bonus);
                if (result)
                {
                    return true;
                }
                result = CheckItemInDropOut(itemId, storyFightCfg.bonusRandomArr);
                return result;
            }
            return false;
        }
        private static bool CheckItemInBonus(int itemId, int[][] bosnu)
        {
            List aList = ItemUtil.CreateItemDataList(bosnu);
            foreach (ItemData itemData in aList)
            {
                if (itemId == itemData.id)
                {
                    return true;
                }
            }
            return false;
        }
        private static bool CheckItemInBonus(int itemId, string bosnu)
        {
            List aList = ItemUtil.CreateItemDataList(bosnu);
            foreach (ItemData itemData in aList)
            {
                if (itemId == itemData.id)
                {
                    return true;
                }
            }
            return false;
        }
        private static bool CheckItemInDropOut(int itemId, int[] dropIds)
        {
            List result = new List();
            foreach (int dropId in dropIds)
            {
                DropOutCfgArray manager = DropOutCfgArray.Instance;
                DropOutCfg[] aList = manager.GetCfgs(dropId);
                foreach (DropOutCfg dropOutCfg in aList)
                {
                    if (itemId == dropOutCfg.item)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        private static int CheckItemInSuit(int ItemId, string suitIds)
        {
            if (suitIds.Length > 0)
            {
                string[] aArray = suitIds.Split(';');
                foreach (string value in aArray)
                {
                    int valueInt = int.Parse(value);
                    bool result = CheckItemInSuit(ItemId, valueInt);
                    if (result)
                    {
                        return valueInt;
                    }
                }
            }
            return 0;
        }
        private static bool CheckItemInSuit(int ItemId, int suitId)
        {
            SuitCfgArray manager = SuitCfgArray.Instance;
            SuitCfg suitCfg = manager.GetCfg(suitId);
            int[] aArray = suitCfg.partsArr;
            foreach (int valueInt in aArray)
            {
                if (ItemId == valueInt)
                {
                    return true;
                }
            }
            return false;
        }
    }
}