using Impact.Interactions.Particles;
using ImpactCFX;
using ImpactCFX.Particles;
using UnityEditor;
using UnityEngine;

namespace ImpactCFXConversion
{
    public class ImpactParticleEffectConverter : IAssetConverter
    {
        public Object Convert(Object source, ConversionContext conversionContext)
        {
            if (source is ImpactParticleInteraction a)
            {
                return convertParticleInteraction(a, conversionContext);
            }
            else
            {
                return null;
            }
        }

        private ImpactParticleEffectAuthoring convertParticleInteraction(ImpactParticleInteraction particleInteraction, ConversionContext conversionContext)
        {
            ImpactParticleEffectAuthoring convertedEffect = ScriptableObject.CreateInstance<ImpactParticleEffectAuthoring>();
            SerializedObject serializedObject = new SerializedObject(convertedEffect);

            //Particle prefab
            if (particleInteraction.ParticlePrefab is ImpactParticles p)
            {
                ImpactParticleSystem convertedParticles = ConversionUtility.ConvertPrefab<ImpactParticles, ImpactParticleSystem>(
                    p,
                    conversionContext,
                    convertParticleSystem);

                if (convertedParticles == null || convertedParticles.Equals(null))
                {
                    Debug.LogWarning($"Particles Prefab for particle interaction {particleInteraction.name} is null or missing.");
                }

                serializedObject.FindProperty("particlePrefab").objectReferenceValue = convertedParticles;
            }
            else
            {
                Debug.LogError($"Cannot convert custom ImpactParticles component on '{particleInteraction.ParticlePrefab}'");
            }

            //Other properties
            ParticleEffectType particleEffectType = particleInteraction.IsParticleLooped ? ParticleEffectType.Looped : ParticleEffectType.OneShot;
            serializedObject.FindProperty("particleEffectType").enumValueIndex = (int)particleEffectType;

            serializedObject.FindProperty("minimumVelocity").floatValue = particleInteraction.MinimumVelocity;
            serializedObject.FindProperty("collisionNormalInfluence").floatValue = particleInteraction.CollisionNormalInfluence;

            serializedObject.FindProperty("emitOnSlide").boolValue = particleInteraction.EmitOnSlide;
            serializedObject.FindProperty("emitOnRoll").boolValue = particleInteraction.EmitOnRoll;


            serializedObject.ApplyModifiedProperties();
            serializedObject.Dispose();

            return convertedEffect;
        }

        private void convertParticleSystem(ImpactParticles src, SerializedObject srcObject, ImpactParticleSystem dst, SerializedObject dstObject)
        {
            ConversionUtility.ConvertObjectPoolConfig(src.PoolSize, src.PoolFallbackMode, dstObject.FindProperty("objectPoolConfig"));

            dstObject.FindProperty("rotationMode").enumValueIndex = (int)src.RotationMode;
            dstObject.FindProperty("axis").enumValueIndex = (int)src.Axis;
        }
    }
}

