﻿using UnityEngine;

namespace DarkTonic.MasterAudio
{
    public static class ResonanceAudioHelper
    {
        public static bool ResonanceAudioOptionExists {
            get {
#if UNITY_2018_1_OR_NEWER
            return true;
#else
                return false;
#endif
            }
        }

        public static bool DarkTonicResonanceAudioPackageInstalled()
        {
            return true;
        }

        public static void AddResonanceAudioSourceToVariation(SoundGroupVariation variation)
        {
            var ras = variation.GetComponent<ResonanceAudioSource>();
            if (ras != null)
            {
                return;
            }

            variation.gameObject.AddComponent<ResonanceAudioSource>();
        }

        public static void AddResonanceAudioSourceToAllVariations()
        {
            var added = 0;

            for (var i = 0; i < MasterAudio.Instance.Trans.childCount; i++)
            {
                var aGrp = MasterAudio.Instance.Trans.GetChild(i);
                for (var v = 0; v < aGrp.childCount; v++)
                {
                    var aVar = aGrp.GetChild(v);
                    var ras = aVar.GetComponent<ResonanceAudioSource>();
                    if (ras != null)
                    {
                        continue;
                    }

                    aVar.gameObject.AddComponent<ResonanceAudioSource>();
                    added++;
                }
            }

            Debug.Log(added + " Resonance Audio Source components added to MasterAudio Variations.");
        }

        public static void RemoveResonanceAudioSourceFromAllVariations()
        {
            var killed = 0;

            for (var i = 0; i < MasterAudio.Instance.Trans.childCount; i++)
            {
                var aGrp = MasterAudio.Instance.Trans.GetChild(i);
                for (var v = 0; v < aGrp.childCount; v++)
                {
                    var aVar = aGrp.GetChild(v);
                    var ras = aVar.GetComponent<ResonanceAudioSource>();
                    if (ras == null)
                    {
                        continue;
                    }

                    GameObject.DestroyImmediate(ras);
                    killed++;
                }
            }

            Debug.Log(killed + " Resonance Audio Source components deleted from MasterAudio Variations.");
        }

        public static void CopyResonanceAudioSource(DynamicGroupVariation sourceVariation, DynamicGroupVariation destVariation)
        {
            if (!ResonanceAudioOptionExists)
            {
                return;
            }

            if (!SpatializerHelper.IsResonanceAudioSpatializer)
            {
                return;
            }

#if UNITY_EDITOR
        var ras = sourceVariation.GetComponent<ResonanceAudioSource>();
        UnityEditorInternal.ComponentUtility.CopyComponent(ras);
        UnityEditorInternal.ComponentUtility.PasteComponentAsNew(destVariation.gameObject);
#endif
        }

        public static void CopyResonanceAudioSource(DynamicGroupVariation sourceVariation, SoundGroupVariation destVariation)
        {
            if (!ResonanceAudioOptionExists)
            {
                return;
            }

            if (!SpatializerHelper.IsResonanceAudioSpatializer)
            {
                return;
            }

#if UNITY_EDITOR
        var ras = sourceVariation.GetComponent<ResonanceAudioSource>();
        UnityEditorInternal.ComponentUtility.CopyComponent(ras);
        UnityEditorInternal.ComponentUtility.PasteComponentAsNew(destVariation.gameObject);
#endif
        }

        public static void CopyResonanceAudioSource(SoundGroupVariation sourceVariation, DynamicGroupVariation destVariation)
        {
            if (!ResonanceAudioOptionExists)
            {
                return;
            }

            if (!SpatializerHelper.IsResonanceAudioSpatializer)
            {
                return;
            }

#if UNITY_EDITOR
        var ras = sourceVariation.GetComponent<ResonanceAudioSource>();
        UnityEditorInternal.ComponentUtility.CopyComponent(ras);
        UnityEditorInternal.ComponentUtility.PasteComponentAsNew(destVariation.gameObject);
#endif
        }
    }
}