using NUnit.Framework;
using FluentAssertions;

using System.Linq;

using Encompass;
using System.Collections.Generic;
using System;

namespace Tests
{
    struct MockComponent : IComponent
    {
        public string myString;
        public int myInt;
    }

    public class EntityTest
    {
        [Test]
        public void AddComponent()
        {
            var worldBuilder = new WorldBuilder();
            var entity = worldBuilder.CreateEntity();

            MockComponent mockComponent;
            mockComponent.myInt = 3;
            mockComponent.myString = "hello";

            entity.AddComponent<MockComponent>(mockComponent);

            var world = worldBuilder.Build();
            // world.Update();

            Assert.IsTrue(entity.HasComponent<MockComponent>());
            Assert.That(entity.GetComponent<MockComponent>().Value, Is.EqualTo(mockComponent));
        }

        [Test]
        public void GetComponents()
        {
            var worldBuilder = new WorldBuilder();
            var entity = worldBuilder.CreateEntity();

            MockComponent mockComponentA;
            mockComponentA.myInt = 3;
            mockComponentA.myString = "hello";

            MockComponent mockComponentB;
            mockComponentB.myInt = 5;
            mockComponentB.myString = "wassup";

            MockComponent mockComponentC;
            mockComponentC.myInt = 1;
            mockComponentC.myString = "howdy";

            var componentAID = entity.AddComponent<MockComponent>(mockComponentA);
            var componentBID = entity.AddComponent<MockComponent>(mockComponentB);
            var componentCID = entity.AddComponent<MockComponent>(mockComponentC);

            var world = worldBuilder.Build();

            var components = entity.GetComponents<MockComponent>();
            components.Should().Contain(new KeyValuePair<Guid, MockComponent>(componentAID, mockComponentA));
            components.Should().Contain(new KeyValuePair<Guid, MockComponent>(componentBID, mockComponentB));
            components.Should().Contain(new KeyValuePair<Guid, MockComponent>(componentCID, mockComponentC));
        }

        [Test]
        public void GetComponent()
        {
            var worldBuilder = new WorldBuilder();
            var entity = worldBuilder.CreateEntity();

            MockComponent mockComponent;
            mockComponent.myInt = 3;
            mockComponent.myString = "hello";

            var componentID = entity.AddComponent<MockComponent>(mockComponent);

            var world = worldBuilder.Build();

            Assert.AreEqual(new KeyValuePair<Guid, MockComponent>(componentID, mockComponent), entity.GetComponent<MockComponent>());
        }

        [Test]
        public void HasComponent()
        {
            var worldBuilder = new WorldBuilder();
            var entity = worldBuilder.CreateEntity();

            MockComponent mockComponent;
            mockComponent.myInt = 3;
            mockComponent.myString = "hello";

            entity.AddComponent<MockComponent>(mockComponent);

            var world = worldBuilder.Build();

            Assert.IsTrue(entity.HasComponent<MockComponent>());
        }
    }
}