using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

/// <summary>
/// A script that spawns and destroys a number of AssetReferences after a given delay.
/// </summary>
public class PrefabSpawnerSample : MonoBehaviour
{
    /// <summary>
    /// The prefab to spawn.
    /// </summary>
    public AssetReference SpawnablePrefab;

    /// <summary>
    /// The time, in seconds, to delay before spawning prefabs.
    /// </summary>
    public float DelayBetweenSpawns = 2.0f;

    /// <summary>
    /// The time, in seconds, to delay before destroying the spawned prefabs.
    /// </summary>
    public float DealyBeforeDestroying = 1.0f;

    /// <summary>
    /// The number of prefabs to spawn.
    /// </summary>
    public int NumberOfPrefabsToSpawn = 1;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(StartSpawner());
    }

    IEnumerator StartSpawner()
    {
        while (true)
        {
            yield return new WaitForSeconds(DelayBetweenSpawns);
            StartCoroutine(SpawnTemporaryCube());
        }
    }

    IEnumerator SpawnTemporaryCube()
    {
        List<AsyncOperationHandle<GameObject>> handles = new List<AsyncOperationHandle<GameObject>>();

        for (int i = 0; i < NumberOfPrefabsToSpawn; i++)
        {
            //Instantiates a prefab with the address "Cube".  If this isn't working make sure you have your Addressable Groups
            //window setup and a prefab with the address "Cube" exists.
            AsyncOperationHandle<GameObject> handle = SpawnablePrefab.InstantiateAsync();
            handles.Add(handle);
        }

        yield return new WaitForSeconds(DealyBeforeDestroying);

        //Release the AsyncOperationHandles which destroys the GameObject
        foreach (var handle in handles)
            Addressables.Release(handle);
    }
}