using FishNet.Managing;
using FishNet.Object;
using System;
using UnityEngine;
namespace FishNet.Utility.Performance
{
    public abstract class ObjectPool : MonoBehaviour
    {
        /// 
        /// NetworkManager this ObjectPool belongs to.
        /// 
        protected NetworkManager NetworkManager {get; private set;}
        /// 
        /// Initializes this script for use.
        /// 
        public virtual void InitializeOnce(NetworkManager nm)
        {
            NetworkManager = nm;
        }
        /// 
        /// Returns an object that has been stored using collectioNid of 0. A new object will be created if no stored objects are available.
        /// 
        /// PrefabId of the object to return.
        /// True if being called on the server side.
        /// 
        public abstract NetworkObject RetrieveObject(int prefabId, bool asServer);
        /// 
        /// Returns an object that has been stored. A new object will be created if no stored objects are available.
        /// 
        /// PrefabId of the object to return.
        /// True if being called on the server side.
        /// 
        public virtual NetworkObject RetrieveObject(int prefabId, ushort collectionId, bool asServer) => null;
        /// 
        /// Stores an object into the pool.
        /// 
        /// Object to store.
        /// True if being called on the server side.
        /// 
        public abstract void StoreObject(NetworkObject instantiated, bool asServer);
    }
}