namespace PkmnLib.Static.Libraries;

/// <summary>
/// The storage for all different static libraries.
/// </summary>
public interface IStaticLibrary
{
    /// <summary>
    /// The miscellaneous settings for the library.
    /// </summary>
    LibrarySettings Settings { get; }

    /// <summary>
    /// All data for Pokémon species.
    /// </summary>
    IReadOnlySpeciesLibrary Species { get; }

    /// <summary>
    /// All data for Pokémon moves.
    /// </summary>
    IReadOnlyMoveLibrary Moves { get; }

    /// <summary>
    /// All data for Pokémon abilities.
    /// </summary>
    IReadOnlyAbilityLibrary Abilities { get; }

    /// <summary>
    /// All data for Pokémon types and their effectiveness.
    /// </summary>
    IReadOnlyTypeLibrary Types { get; }

    /// <summary>
    /// All data for Pokémon natures.
    /// </summary>
    IReadOnlyNatureLibrary Natures { get; }

    /// <summary>
    /// All data for Pokémon growth rates.
    /// </summary>
    IReadOnlyGrowthRateLibrary GrowthRates { get; }

    /// <summary>
    /// All data for Pokémon items.
    /// </summary>
    IReadOnlyItemLibrary Items { get; }
}

/// <inheritdoc />
public class StaticLibraryImpl : IStaticLibrary
{
    /// <inheritdoc cref="StaticLibraryImpl" />
    public StaticLibraryImpl(LibrarySettings settings, IReadOnlySpeciesLibrary species, IReadOnlyMoveLibrary moves,
        IReadOnlyAbilityLibrary abilities, IReadOnlyTypeLibrary types, IReadOnlyNatureLibrary natures,
        IReadOnlyGrowthRateLibrary growthRates, IReadOnlyItemLibrary items)
    {
        Settings = settings;
        Species = species;
        Moves = moves;
        Abilities = abilities;
        Types = types;
        Natures = natures;
        GrowthRates = growthRates;
        Items = items;
    }

    /// <inheritdoc />
    public LibrarySettings Settings { get; }

    /// <inheritdoc />
    public IReadOnlySpeciesLibrary Species { get; }

    /// <inheritdoc />
    public IReadOnlyMoveLibrary Moves { get; }

    /// <inheritdoc />
    public IReadOnlyAbilityLibrary Abilities { get; }

    /// <inheritdoc />
    public IReadOnlyTypeLibrary Types { get; }

    /// <inheritdoc />
    public IReadOnlyNatureLibrary Natures { get; }

    /// <inheritdoc />
    public IReadOnlyGrowthRateLibrary GrowthRates { get; }

    /// <inheritdoc />
    public IReadOnlyItemLibrary Items { get; }
}