// Assets/_Project/Scripts/Gameplay/WaveDefinition.cs
using System;
using UnityEngine;

namespace TD.Gameplay
{
    /// <summary>
    /// A single spawn group within a wave: one enemy type and how many of them.
    /// </summary>
    [Serializable]
    public struct WaveEntry
    {
        [Tooltip("The enemy type to spawn for this group.")]
        public EnemyDefinition EnemyType;

        [Tooltip("How many enemies of this type to spawn.")]
        public int Count;
    }

    /// <summary>
    /// Defines the composition of a single wave. One asset per wave; referenced in
    /// order by <see cref="WaveManager.waveDefinitions"/>.
    /// </summary>
    /// <remarks>
    /// Entries are processed in array order. Multiple entries let designers mix enemy
    /// types within one wave (e.g. 10 fast scouts followed by 3 armoured brutes).
    /// All enemies spawn held at wave start; they are released in 10% chunks separated
    /// by <see cref="ReleaseInterval"/> seconds. The wave is not complete until all
    /// enemies are dead or have leaked.
    /// </remarks>
    [CreateAssetMenu(fileName = "WaveDefinition", menuName = "TD/Wave Definition", order = 4)]
    public class WaveDefinition : ScriptableObject
    {
        [Tooltip("Seconds between the wave-number advancing (start of prep) and the " +
                 "first enemies becoming visible. Gives players time to build before the horde appears.")]
        public float PrepTime = 10f;

        [Tooltip("Seconds between each chunk release. All enemies spawn held at wave " +
                 "start and are released 10% at a time on this interval.")]
        public float ReleaseInterval = 2f;

        [Tooltip("Enemy groups that make up this wave. Processed in order.")]
        public WaveEntry[] Entries;
    }
}
