using System;
using System.Collections.Generic;

namespace UnityEngine.U2D.IK
{
    /// <summary>
    /// Base class used for defining culling strategies for IKManager2D.
    /// </summary>
    internal abstract class BaseCullingStrategy
    {
        public bool enabled => m_IsCullingEnabled;
        bool m_IsCullingEnabled;

        HashSet<object> m_RequestingManagers;

        /// <summary>
        /// Used to check if bone transforms should be culled.
        /// </summary>
        /// <param name="transformIds">A collection of bones' transform ids.</param>
        /// <returns>True if any bone is visible.</returns>
        public abstract bool AreBonesVisible(IList<int> transformIds);

        public void AddRequestingObject(object requestingObject)
        {
            if (!m_IsCullingEnabled)
            {
                m_IsCullingEnabled = true;

                Initialize();
            }

            m_RequestingManagers.Add(requestingObject);
        }

        public void RemoveRequestingObject(object requestingObject)
        {
            if (m_RequestingManagers.Remove(requestingObject) && m_RequestingManagers.Count == 0)
            {
                m_IsCullingEnabled = false;

                Disable();
            }
        }

        public void Initialize()
        {
            m_RequestingManagers = new HashSet<object>();
            OnInitialize();
        }

        public void Update()
        {
            OnUpdate();
        }

        public void Disable()
        {
            OnDisable();
        }

        protected virtual void OnInitialize() { }
        protected virtual void OnUpdate() { }
        protected virtual void OnDisable() { }
    }
}