﻿using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.Games.RpgMaterial.Common;

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.Service.Material
{
    public static class GameMaterialUtils
    {
#if UNITY_EDITOR
        /// <summary>
        /// 打印信息
        /// </summary>
        /// <param name="urs"></param>
        /// <typeparam name="T"></typeparam>
        public static void PrintUserMaterial<T>(T[] urs) where T : IGameUserMaterial
        {
            DebugUtil.LogWarning("打印材料数据：", urs?.Length);
            if (null == urs || urs.Length == 0) return;
            foreach (var ur in urs)
            {
                DebugUtil.Log($"数据({ur.Type})：", ur);
            }
        }
#endif

        /// <summary>
        /// 检查材料类型对应的用户数据是否使用独立Id
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool CheckMaterialUnique(int type)
        {
            if (!ServiceRegister.CheckMaterialExist(type)) return false;
            return ServiceCenter.GetMaterialService(type).IsUnique;
        }

        /// <summary>
        /// 求材料数量
        /// </summary>
        /// <param name="type"></param>
        /// <param name="mid"></param>
        /// <returns></returns>
        public static int GetUserMaterialNum(int type, int mid)
        {
            return ServiceCenter.GetMaterialService(type).GetUserMaterialNum(mid);
        }

        /// <summary>
        /// 检查存在性
        /// </summary>
        /// <param name="type"></param>
        /// <param name="mid"></param>
        /// <returns></returns>
        public static bool IsUserMaterialExist(int type, int mid)
        {
            return GetUserMaterialNum(type, mid) > 0;
        }

        /// <summary>
        /// 检测是否足够
        /// </summary>
        /// <param name="type"></param>
        /// <param name="mid"></param>
        /// <param name="need"></param>
        /// <param name="multi"></param>
        /// <returns></returns>
        public static bool CheckEnough(int type, int mid, int need, int multi = 1)
        {
            return GetUserMaterialNum(type, mid) >= need * multi;
        }

        /// <summary>
        /// 检测是否足够
        /// </summary>
        /// <param name="need"></param>
        /// <param name="multi"></param>
        /// <returns></returns>
        public static bool CheckEnough(DataNum need, int multi = 1)
        {
            return GetUserMaterialNum(need.Type, need.Id) >= need.Num * multi;
        }

        /// <summary>
        /// 检测是否足够
        /// </summary>
        /// <param name="need"></param>
        /// <param name="multi"></param>
        /// <returns></returns>
        public static bool CheckEnough(DataOffset need, int multi = 1)
        {
            return GetUserMaterialNum(need.Type, need.Id) >= need.AbsOffset * multi;
        }

        /// <summary>
        /// 检测是否足够
        /// </summary>
        /// <param name="needs"></param>
        /// <param name="multi"></param>
        /// <returns></returns>
        public static int CheckEnoughs(DataNum[] needs, int multi = 1)
        {
            if (null == needs || needs.Length == 0) return -1;
            for (var index = 0; index < needs.Length; index++)
            {
                if (!CheckEnough(needs[index], multi)) return index;
            }

            return -1;
        }

        /// <summary>
        /// 检测是否足够
        /// </summary>
        /// <param name="needs"></param>
        /// <param name="multi"></param>
        /// <returns></returns>
        public static int CheckEnoughs(DataOffset[] needs, int multi = 1)
        {
            if (null == needs || needs.Length == 0) return -1;
            for (var index = 0; index < needs.Length; index++)
            {
                if (!CheckEnough(needs[index], multi)) return index;
            }

            return -1;
        }
    }
}