using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using FMODUnity;
using FMOD.Studio;

namespace GamecraftModdingAPI.Utility
{
    /// <summary>
    /// Common operations on audio objects
    /// </summary>
    public static class AudioTools
    {
        /// <summary>
        /// Retrieve the list of mixers (aka VCAs)
        /// </summary>
        /// <returns>The names of the mixers (without "vca:/")</returns>
        public static string[] GetMixers()
        {
            Bank masterBank;
            RuntimeManager.StudioSystem.getBank("bank:/Master Bank", out masterBank);
            VCA[] masterVCAs;
            int count;
            masterBank.getVCAList(out masterVCAs);
            masterBank.getVCACount(out count);
            string[] result = new string[count];
            string path;
            for (int i = 0; i < count; i++)
            {
                masterVCAs[i].getPath(out path);
                result[i] = path.Replace("vca:/", "");
            }
            return result;
        }

        /// <summary>
        /// Get the volume of an audio mixer
        /// </summary>
        /// <param name="mixer">The name of the mixer</param>
        /// <returns>The volume</returns>
        public static float GetVolume(string mixer)
        {
            float volume, finalVolume;
            RuntimeManager.GetVCA($"vca:/{mixer}").getVolume(out volume, out finalVolume);
            return volume;
        }

        /// <summary>
        /// Get the volume of an audio mixer at output time (this is influenced by the mixer volume and master volume)
        /// </summary>
        /// <param name="mixer">The name of the mixer</param>
        /// <returns>The final volume</returns>
        public static float GetVolumeOutput(string mixer)
        {
            float volume, finalVolume;
            RuntimeManager.GetVCA($"vca:/{mixer}").getVolume(out volume, out finalVolume);
            return finalVolume;
        }

        /// <summary>
        /// Set the volume of an audio mixer (like a VCA aka Voltage-Controlled Amplifier)
        /// </summary>
        /// <param name="volume">The volume from 0.0 to 1.0 (1.0+ is valid too)</param>
        /// <param name="mixer">The name of the mixer, as retrieved from GetMixers()</param>
        public static void SetVolume(float volume, string mixer)
        {
            RuntimeManager.GetVCA($"vca:/{mixer}").setVolume(volume);
        }

        /// <summary>
        /// Set the volume for all future audio
        /// </summary>
        /// <param name="volume">The volume from 0.0 to 1.0 (1.0+ is valid too)</param>
        public static void SetVolumeMaster(float volume)
        {
            RuntimeManager.GetBus("bus:/").setVolume(volume);
        }
    }
}