using System.Linq;
using PkmnLibSharp.Battling;
using PkmnLibSharp.Library;
using PkmnLibSharp.Library.GrowthRates;
using PkmnLibSharp.Library.Items;
using PkmnLibSharp.Library.Moves;

namespace PkmnLibSharpTests.Battling
{
    public static class BattleLibraryHelper
    {
        private static BattleLibrary _cache;
        
        public static BattleLibrary GetLibrary()
        {
            if (_cache != null) return _cache;

            _cache = new BattleLibrary(BuildStatic(), new StatCalculator(), new DamageLibrary(),
                new ExperienceLibrary(),
                new AngelScriptResolver(), new MiscLibrary());
            return _cache;
        }

        private static PokemonLibrary BuildStatic()
        {
            var settings = new LibrarySettings(100, 4, 4096);
            var species = new SpeciesLibrary(10);
            species.Insert("testSpecies", new Species(1, "testSpecies",
                new Forme("default", 10f, 10f, 100, new byte[] {0, 1}, 100,
                    100, 100, 100, 100, 100, new[] {"testAbility", "testAbility2"},
                    new[] {"testHiddenAbility"}, new LearnableMoves(100), new string[0]), 0.5f, "growthRate",
                20, 100, new[]{"testEggGroup"}, new string[0]));
            
            var moves = new MoveLibrary(10);
            moves.Insert("testMove", new MoveData("testMove", 0, MoveCategory.Physical, 100,
                100, 20, MoveTarget.Any, 0, 0f, "", 
                new EffectParameter[0], new string[0]));
            moves.Insert("testMove2", new MoveData("testMove2", 0, MoveCategory.Physical, 100,
                100, 20, MoveTarget.Any, 0, 0f, "", 
                new EffectParameter[0], new string[0]));
            
            var items = new ItemLibrary(10);
            items.Insert("testItem", new Item("testItem", ItemCategory.MiscItem, BattleItemCategory.None,
                500, new string[] { }, 20));
            var gr = new GrowthRateLibrary(10);
            gr.AddGrowthRate("growthRate", 
                new LookupGrowthRate(
                    Enumerable.Range(1, 100).Select(x => (uint)x * 100).ToArray()));
            var types = new TypeLibrary(10);
            types.RegisterType("normal");
            types.RegisterType("fighting");
            var natures = new NatureLibrary(10);
            natures.LoadNature("testNature", new Nature());
            var lib = new PokemonLibrary(settings, species, moves, items, gr, types, natures);
            return lib;
        }
    }
}