using System.Collections;

namespace PkmnLib.Dynamic.ScriptHandling;

/// <summary>
/// Iterator to figure out the scripts to run.
/// </summary>
public class ScriptIterator : IEnumerable<ScriptContainer>
{
    private readonly IReadOnlyList<IEnumerable<ScriptContainer>> _scripts;

    /// <inheritdoc cref="ScriptIterator"/>
    public ScriptIterator(IReadOnlyList<IEnumerable<ScriptContainer>> scripts)
    {
        _scripts = scripts;
    }

    private IEnumerable<ScriptContainer> GetAsEnumerable()
    {
        foreach (var enumerable in _scripts)
        {
            if (enumerable is IScriptSet set)
            {
                // We can't assume that the set remains the same size, so we need to iterate through it
                // with a for loop.
                for (var j = 0; j < set.Count; j++)
                {
                    var script = set.At(j);
                    // We can ignore empty scripts.
                    if (script.IsEmpty)
                        continue;
                    yield return script;
                }
            }
            else
            {
                foreach (var script in enumerable)
                {
                    // We can ignore empty scripts.
                    if (script.IsEmpty)
                        continue;
                    yield return script;
                }
            }
        }
    }

    /// <inheritdoc />
    public IEnumerator<ScriptContainer> GetEnumerator() => GetAsEnumerable().GetEnumerator();

    /// <inheritdoc />
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}