﻿/*! \cond PRIVATE */
using UnityEngine;

namespace DarkTonic.MasterAudio {
	public static class OculusAudioHelper {
	    public static bool OculusAudioOptionExists {
	        get {
	#if UNITY_2017_1_OR_NEWER
	            return true;
	#else
	            return false;
	#endif
	        }
	    }

	    public static bool DarkTonicOculusAudioPackageInstalled() {
	        return true;
	    }

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

	        variation.gameObject.AddComponent<ONSPAudioSource>();
	        ras = variation.GetComponent<ONSPAudioSource>();

	        var aud = variation.gameObject.GetComponent<AudioSource>();
	        ras.SetParameters(ref aud);
	    }

	    public static void AddOculusAudioSourceToAllVariations() {
	        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<ONSPAudioSource>();
	                if (ras != null) {
	                    continue;
	                }

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

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

	    public static void RemoveOculusAudioSourceFromAllVariations() {
	        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<ONSPAudioSource>();
	                if (ras == null) {
	                    continue;
	                }

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

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

	    public static void CopyOculusAudioSource(DynamicGroupVariation sourceVariation, DynamicGroupVariation destVariation) {
	        if (!OculusAudioOptionExists) {
	            return;
	        }

	        if (!SpatializerHelper.IsOculusAudioSpatializer) {
	            return;
	        }

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

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

	        if (!SpatializerHelper.IsOculusAudioSpatializer) {
	            return;
	        }

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

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

	        if (!SpatializerHelper.IsOculusAudioSpatializer) {
	            return;
	        }

	#if UNITY_EDITOR
	        var ras = sourceVariation.GetComponent<ONSPAudioSource>();
	        UnityEditorInternal.ComponentUtility.CopyComponent(ras);
	        UnityEditorInternal.ComponentUtility.PasteComponentAsNew(destVariation.gameObject);
	#endif
	    }
	}
}
/*! \endcond */
