using System.Collections.Generic;
using System.Linq;

namespace PKHeX.Core
{
    public static class BoxManipUtil
    {
        /// <summary>
        /// Grouped categories of different <see cref="IBoxManip"/>.
        /// </summary>
        public static readonly IReadOnlyList<IBoxManip>[] ManipCategories =
        {
            BoxManipBase.ClearCommon,
            BoxManipBase.SortCommon,
            BoxManipBase.SortAdvanced,
            BoxManipBase.ModifyCommon,
        };

        public static readonly string[] ManipCategoryNames =
        {
            "Delete",
            "Sort",
            "SortAdvanced",
            "Modify",
        };

        /// <summary>
        /// Gets a <see cref="IBoxManip"/> reference that carries out the action of the requested <see cref="type"/>.
        /// </summary>
        /// <param name="type">Manipulation type.</param>
        /// <returns>Reference to <see cref="IBoxManip"/>.</returns>
        public static IBoxManip GetManip(this BoxManipType type) => ManipCategories.SelectMany(c => c).FirstOrDefault(m => m.Type == type);

        /// <summary>
        /// Gets the corresponding name from <see cref="ManipCategoryNames"/> for the requested <see cref="type"/>.
        /// </summary>
        /// <param name="type">Manipulation type.</param>
        /// <returns>Category Name</returns>
        public static string? GetManipCategoryName(this BoxManipType type)
        {
            for (int i = 0; i < ManipCategories.Length; i++)
            {
                if (ManipCategories[i].Any(z => z.Type == type))
                    return ManipCategoryNames[i];
            }
            return null;
        }

        /// <summary>
        /// Gets the corresponding name from <see cref="ManipCategoryNames"/> for the requested <see cref="manip"/>.
        /// </summary>
        /// <param name="manip">Manipulation type.</param>
        /// <returns>Category Name</returns>
        public static string? GetManipCategoryName(this IBoxManip manip)
        {
            for (int i = 0; i < ManipCategories.Length; i++)
            {
                if (ManipCategories[i].Any(z => z == manip))
                    return ManipCategoryNames[i];
            }
            return null;
        }
    }
}