using System;

namespace PKHeX.Core;

public interface IEventFlagArray
{
    int EventFlagCount { get; }
    bool GetEventFlag(int flagNumber);
    void SetEventFlag(int flagNumber, bool value);
}

public interface IEventFlag37 : IEventFlagArray, IEventWorkArray<ushort> { }

public static class EventFlagArrayExtensions
{
    /// <summary> All Event Flag values for the savegame </summary>
    public static bool[] GetEventFlags(this IEventFlagArray source)
    {
        var result = new bool[source.EventFlagCount];
        for (int i = 0; i < result.Length; i++)
            result[i] = source.GetEventFlag(i);
        return result;
    }

    /// <summary> All Event Flag values for the savegame </summary>
    public static void SetEventFlags(this IEventFlagArray source, ReadOnlySpan<bool> value)
    {
        if (value.Length != source.EventFlagCount)
            return;
        for (int i = 0; i < value.Length; i++)
            source.SetEventFlag(i, value[i]);
    }
}

public interface IEventWorkArray<T> where T : unmanaged
{
    public int EventWorkCount { get; }
    public T GetWork(int index);
    public void SetWork(int index, T value = default);
}

public static class EventWorkArrayExtensions
{
    /// <summary> All Event Constant values for the savegame </summary>
    public static T[] GetAllEventWork<T>(this IEventWorkArray<T> source) where T : unmanaged
    {
        var result = new T[source.EventWorkCount];
        for (int i = 0; i < result.Length; i++)
            result[i] = source.GetWork(i);
        return result;
    }

    /// <summary> All Event Constant values for the savegame </summary>
    public static void SetAllEventWork<T>(this IEventWorkArray<T> source, ReadOnlySpan<T> value) where T : unmanaged
    {
        if (value.Length != source.EventWorkCount)
            return;
        for (int i = 0; i < value.Length; i++)
            source.SetWork(i, value[i]);
    }
}
