using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public static AudioManager Instance { get; private set; }
    private AudioSource ad;
    private Animator anim;
    private Dictionary<string,AudioClip> clipDic = new Dictionary<string,AudioClip>();
    private async void Awake()
    {
        Instance = this;
        ad = gameObject.AddComponent<AudioSource>();
        anim = gameObject.AddComponent<Animator>();
        ad.volume = 0.5f;
        //anim.runtimeAnimatorController = await YooAssetManager.Instance.LoadAsset<RuntimeAnimatorController>("AudioManager");
        DontDestroyOnLoad(gameObject);
    }
    /// <summary>
    /// ���ű�������
    /// </summary>
    /// <param name="audioName"></param>
    public async void PlayAudio(string audioName, bool loop = false)
    {
        if (ad.clip == null)
        {
            ad.clip = await YooAssetManager.Instance.LoadAsset<AudioClip>(audioName);
            ad.volume = 0.5f;
            ad.Play();
            ad.loop = true;
        }
        else
        {
            Debug.Log(anim);
            //anim.Play("bgmdown");
            StartCoroutine("PlayUp", audioName);
        }


    }
    /// <summary>
    /// ����������������� ���Ŷ�������Ƶ
    /// </summary>
    /// <param name="audioName"></param>
    public void PlayDirectAudio(GameObject go, string audioName, float volume = 1, bool loop = false)
    {
        AudioSource goAD;
        if (go.GetComponent<AudioSource>())
        {
            goAD = go.GetComponent<AudioSource>();
        }
        else
        {
            goAD = go.AddComponent<AudioSource>();
        }
        goAD.spatialBlend = 0; goAD.dopplerLevel = 1; goAD.spread = 45; goAD.rolloffMode = AudioRolloffMode.Logarithmic;
        goAD.minDistance = 20; goAD.maxDistance = 500; goAD.volume = volume; goAD.loop = loop;
        goAD.clip = clipDic[audioName];
        if (goAD.clip != null) goAD.Play();
    }
    /// <summary>
    /// �����굱ǰAudioManager��Ƶ���
    /// </summary>
    public void AudioFinished()
    {
        StartCoroutine("Finished", ad);
    }
    /// <summary>
    /// �����굱ǰ������Ƶ���
    /// </summary>
    /// <param name="go"></param>
    public void AudioFinished(GameObject go)
    {
        AudioSource gAD = go.GetComponent<AudioSource>();
        if (gAD) StartCoroutine("Finished", gAD);
    }
    IEnumerator Finished(AudioSource audioSource)
    {
        yield return new WaitForSeconds(audioSource.clip.length);
        audioSource.clip = null;
        Destroy(audioSource);
        StopCoroutine("Finished");
    }

    /// <summary>
    /// �������ּ�������
    /// </summary>
    public void Mute()
    {
        //anim.Play("bgmdown");
    }

    /// <summary>
    /// �������ֽ�ǿ
    /// </summary>
    public void VolumeUp()
    {
        //anim.Play("bgmup");
    }

    /// <summary>
    /// ���� GameObject
    /// </summary>
    /// <param name="go"></param>
    public void Mute(GameObject go)
    {
        AudioSource gAD = go.GetComponent<AudioSource>();
        gAD.mute = true;
    }
    
    /// <summary>
    /// ��������
    /// </summary>
    /// <param name="volume"></param>
    public void SetVolume(float volume)
    {
        ad.volume = volume;
    }
}