using DarkTonic.MasterAudio;
using UnityEngine;

namespace ImpactCFX.MasterAudio
{
    public class MasterAudioEffectProxy : PooledEffectObjectBase
    {
        private PlaySoundResult playSoundResult;

        private CollisionResultData collisionResultData;
        private float targetVolumeScale, currentVolumeScale;

        public float AudioFadeTime = 0.2f;

        public void PlayMasterAudioEffect(MasterAudioEffectResult masterAudioEffectResult, string soundGroup, CollisionResultData collisionResultData)
        {
#if IMPACTCFX_DEBUG
            ImpactCFXLogger.LogEffectPlay(GetType(), collisionResultData, $"SoundGroup = {soundGroup}), VolumeScale = {masterAudioEffectResult.VolumeScale}");
#endif
            this.collisionResultData = collisionResultData;

            targetVolumeScale = currentVolumeScale = masterAudioEffectResult.VolumeScale;

            transform.position = collisionResultData.Point;
            if (collisionResultData.CollisionType == CollisionType.Collision)
                attach(collisionResultData);

            playSoundResult = DarkTonic.MasterAudio.MasterAudio.PlaySound3DAtVector3(soundGroup, collisionResultData.Point, masterAudioEffectResult.VolumeScale);

            if (playSoundResult != null && playSoundResult.SoundPlayed)
            {
                NeedsUpdate = true;
            }
            else
            {
                ReturnToPool();
            }
        }

        public void UpdateMasterAudioEffectCollision(MasterAudioEffectResult masterAudioEffectResult, CollisionResultData collisionResultData)
        {
            this.collisionResultData = collisionResultData;
            targetVolumeScale = masterAudioEffectResult.VolumeScale;

            transform.position = collisionResultData.Point;
            playSoundResult.ActingVariation.Trans.position = transform.position;
        }

        public override void UpdatePooledObject()
        {
            if (!playSoundResult.ActingVariation.IsPlaying || currentVolumeScale < 0.01f)
            {
                ReturnToPool();
            }
            else
            {
                if (playSoundResult != null && playSoundResult.ActingVariation != null)
                {
                    playSoundResult.ActingVariation.AdjustVolume(currentVolumeScale);
                    playSoundResult.ActingVariation.Trans.position = transform.position;
                }

                currentVolumeScale = Mathf.MoveTowards(currentVolumeScale, targetVolumeScale, Time.deltaTime / AudioFadeTime);

                if (collisionResultData.CollisionType.IsLooping())
                {
                    targetVolumeScale = 0;
                }
            }
        }

        public override void ReturnToPool()
        {
            base.ReturnToPool();

            if (playSoundResult != null && playSoundResult.ActingVariation != null)
                playSoundResult.ActingVariation.Stop();
        }

        private void OnDestroy()
        {
            if (playSoundResult != null && playSoundResult.ActingVariation != null)
                playSoundResult.ActingVariation.Stop();
        }
    }
}

