using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Svelto.ECS;

namespace GamecraftModdingAPI.Events
{
    /// <summary>
    /// A simple implementation of IEventHandlerEngine sufficient for most uses
    /// </summary>
    public class SimpleEventHandlerEngine : IEventHandlerEngine
    {
        public object type { get; set; }
        public string Name { get; set; }

        private bool isActivated = false;

        private readonly Action<IEntitiesDB> onActivated;

        private readonly Action<IEntitiesDB> onDestroyed;

        public IEntitiesDB entitiesDB { set; private get; }

        public void Add(ref ModEventEntityStruct entityView, EGID egid)
        {
            if (entityView.type.Equals(this.type))
            {
                isActivated = true;
                onActivated.Invoke(entitiesDB);
            }
        }

        public void Ready() { }

        public void Remove(ref ModEventEntityStruct entityView, EGID egid)
        {
            if (entityView.type.Equals(this.type) && isActivated)
            {
                isActivated = false;
                onDestroyed.Invoke(entitiesDB);
            }
        }

        public void Dispose()
        {
            if (isActivated)
            {
                isActivated = false;
                onDestroyed.Invoke(entitiesDB);
            }
        }

        /// <summary>
        /// Construct the engine
        /// </summary>
        /// <param name="activated">The operation to do when the event is created</param>
        /// <param name="removed">The operation to do when the event is destroyed (if applicable)</param>
        /// <param name="type">The type of event to handle</param>
        /// <param name="name">The name of the engine</param>
        public SimpleEventHandlerEngine(Action activated, Action removed, object type, string name) 
            : this((IEntitiesDB _) => { activated.Invoke(); }, (IEntitiesDB _) => { removed.Invoke(); }, type, name) { }

        /// <summary>
        /// Construct the engine
        /// </summary>
        /// <param name="activated">The operation to do when the event is created</param>
        /// <param name="removed">The operation to do when the event is destroyed (if applicable)</param>
        /// <param name="type">The type of event to handler</param>
        /// <param name="name">The name of the engine</param>
        public SimpleEventHandlerEngine(Action<IEntitiesDB> activated, Action<IEntitiesDB> removed, object type, string name)
        {
            this.type = type;
            this.Name = name;
            this.onActivated = activated;
            this.onDestroyed = removed;
        }
    }
}