using Gamecraft.Damage;
using RobocraftX.Common;
using Svelto.ECS;

namespace GamecraftModdingAPI
{
    /// <summary>
    /// Represnts a cluster of blocks in time running mode, meaning blocks that are connected either directly or via joints.
    /// Only exists if a cluster destruction manager is present. Static blocks like grass and dirt aren't part of a cluster.
    /// </summary>
    public class Cluster
    {
        public EGID Id { get; }

        public Cluster(EGID id)
        {
            Id = id;
        }

        public Cluster(uint id) : this(new EGID(id, CommonExclusiveGroups.SIMULATION_CLUSTERS_GROUP))
        {
        }

        public float InitialHealth
        {
            get => Block.BlockEngine.GetBlockInfo<HealthEntityComponent>(Id).initialHealth;
            set => Block.BlockEngine.GetBlockInfo<HealthEntityComponent>(Id).initialHealth = value;
        }

        public float CurrentHealth
        {
            get => Block.BlockEngine.GetBlockInfo<HealthEntityComponent>(Id).currentHealth;
            set => Block.BlockEngine.GetBlockInfo<HealthEntityComponent>(Id).currentHealth = value;
        }

        public float HealthMultiplier
        {
            get => Block.BlockEngine.GetBlockInfo<HealthEntityComponent>(Id).healthMultiplier;
            set => Block.BlockEngine.GetBlockInfo<HealthEntityComponent>(Id).healthMultiplier = value;
        }

        /// <summary>
        /// Returns the simulation-time rigid bodies for the chunks in this cluster.
        /// </summary>
        /// <returns>An array of sim-bodies</returns>
        public SimBody[] GetSimBodies()
        {
            return Block.BlockEngine.GetClusterBodies(Id.entityID);
        }

        public override string ToString()
        {
            return $"{nameof(Id)}: {Id}";
        }

        protected bool Equals(Cluster other)
        {
            return Id.Equals(other.Id);
        }

        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            if (obj.GetType() != this.GetType()) return false;
            return Equals((Cluster) obj);
        }

        public override int GetHashCode()
        {
            return Id.GetHashCode();
        }
    }
}