using Unity.Mathematics;

namespace ImpactCFX.VFXBatch
{
    public struct VFXBatchEffect : IEffectData<VFXBatchEffectResult>
    {
        public int EffectID { get; set; }

        public ImpactTagMaskFilter IncludeTags { get; set; }
        public ImpactTagMaskFilter ExcludeTags { get; set; }

        public float MinimumVelocity;
        public float CollisionNormalInfluence;

        public ParticleEffectType VisualEffectType;

        public bool EmitOnSlide;
        public bool EmitOnRoll;

        public VFXBatchEffectResult GetResult(CollisionInputData collisionData, MaterialCompositionData materialCompositionData, ImpactVelocityData velocityData, ref Random random)
        {
            VFXBatchEffectResult result = new VFXBatchEffectResult();
            float intensity = EffectUtility.GetCollisionIntensity(velocityData.ImpactVelocity, collisionData.Normal, CollisionNormalInfluence, collisionData.CollisionType) * materialCompositionData.Composition;

            if (intensity < MinimumVelocity || !shouldEmit(collisionData.CollisionType))
                return result;

            if (shouldEmit(collisionData.CollisionType))
            {
                result.IsEffectValid = true;
                result.EffectID = EffectID;
            }

            return result;
        }

        private bool shouldEmit(CollisionType collisionType)
        {
            return (collisionType == CollisionType.Collision && VisualEffectType == ParticleEffectType.OneShot) ||
                (collisionType == CollisionType.Slide && VisualEffectType == ParticleEffectType.Looped && EmitOnSlide) ||
                (collisionType == CollisionType.Roll && VisualEffectType == ParticleEffectType.Looped && EmitOnRoll);
        }
    }
}