#if UNITY_EDITOR

using System;
using UnityEditor;
using UnityEngine.InputSystem.Utilities;

namespace UnityEngine.InputSystem.Editor
{
    internal static class BuildProviderHelpers
    {
        // Adds the given object to the list of preloaded asset if not already present and
        // returns the argument given if the object was added to the list or null if already present.
        public static Object PreProcessSinglePreloadedAsset(Object assetToPreload)
        {
            // Avoid including any null asset
            if (assetToPreload == null)
                return null;

            // If we operate on temporary object instead of a properly persisted asset, adding that temporary asset
            // would result in preloadedAssets containing null object "{fileID: 0}". Hence we ignore these.
            if (EditorUtility.IsPersistent(assetToPreload))
            {
                // Add asset object, if it's not in there already.
                var preloadedAssets = PlayerSettings.GetPreloadedAssets();
                if (preloadedAssets != null && preloadedAssets.IndexOf(assetToPreload) == -1)
                {
                    ArrayHelpers.Append(ref preloadedAssets, assetToPreload);
                    PlayerSettings.SetPreloadedAssets(preloadedAssets);
                    return assetToPreload;
                }
            }

            return null;
        }

        // Removes the given object from preloaded assets if present.
        // The object passed as argument if set to null by this function regardless if existing in preloaded
        // assets or not.
        public static void PostProcessSinglePreloadedAsset(ref Object assetAddedByThisProvider)
        {
            if (assetAddedByThisProvider == null)
                return;

            // Revert back to original state by removing all object(s) from preloaded assets that was added by this processor.
            var preloadedAssets = PlayerSettings.GetPreloadedAssets();
            while (preloadedAssets != null && preloadedAssets.Length > 0)
            {
                var index = Array.IndexOf(preloadedAssets, assetAddedByThisProvider);
                if (index != -1)
                {
                    ArrayHelpers.EraseAt(ref preloadedAssets, index);
                    PlayerSettings.SetPreloadedAssets(preloadedAssets);
                    break;
                }
            }

            assetAddedByThisProvider = null;
        }
    }
}

#endif // UNITY_EDITOR