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

namespace ImpactCFXConversion
{
    public class ImpactDecalEffectConverter : IAssetConverter
    {
        public Object Convert(Object source, ConversionContext conversionContext)
        {
            if (source is ImpactDecalInteraction a)
            {
                return convertDecalInteraction(a, conversionContext);
            }
            else
            {
                return null;
            }
        }

        private ImpactDecalEffectAuthoring convertDecalInteraction(ImpactDecalInteraction decalInteraction, ConversionContext conversionContext)
        {
            ImpactDecalEffectAuthoring convertedEffect = ScriptableObject.CreateInstance<ImpactDecalEffectAuthoring>();
            SerializedObject serializedObject = new SerializedObject(convertedEffect);

            //Particle prefab
            if (decalInteraction.DecalPrefab is Impact.Interactions.Decals.ImpactDecal d)
            {
                ImpactCFX.Decals.ImpactDecal convertedDecal = ConversionUtility.ConvertPrefab<Impact.Interactions.Decals.ImpactDecal, ImpactCFX.Decals.ImpactDecal>(
                    d,
                    conversionContext,
                    convertDecal);

                if (convertedDecal == null || convertedDecal.Equals(null))
                {
                    Debug.LogWarning($"Decal Prefab for decal interaction {decalInteraction.name} is null or missing.");
                }

                serializedObject.FindProperty("decalPrefab").objectReferenceValue = convertedDecal;
            }
            else
            {
                Debug.LogError($"Cannot convert custom ImpactDecal component on '{decalInteraction.DecalPrefab}'");
            }

            //Other properties
            serializedObject.FindProperty("minimumVelocity").floatValue = decalInteraction.MinimumVelocity;
            serializedObject.FindProperty("collisionNormalInfluence").floatValue = decalInteraction.CollisionNormalInfluence;

            serializedObject.FindProperty("createOnCollision").boolValue = decalInteraction.CreateOnCollision;
            serializedObject.FindProperty("createOnSlide").boolValue = decalInteraction.CreateOnSlide;
            serializedObject.FindProperty("createOnRoll").boolValue = decalInteraction.CreateOnRoll;

            ConversionUtility.ConvertRange(decalInteraction.CreationInterval, serializedObject.FindProperty("creationInterval"));
            serializedObject.FindProperty("creationIntervalType").enumValueIndex = (int)decalInteraction.CreationIntervalType;

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

            return convertedEffect;
        }

        private void convertDecal(Impact.Interactions.Decals.ImpactDecal src, SerializedObject srcObject, ImpactCFX.Decals.ImpactDecal dst, SerializedObject dstObject)
        {
            ConversionUtility.ConvertObjectPoolConfig(src.PoolSize, src.PoolFallbackMode, dstObject.FindProperty("objectPoolConfig"));

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

