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

namespace MPStudio
{
    [DisallowMultipleComponent]
    [DefaultExecutionOrder(-1)]
    public class AudioManager : MonoBehaviour
    {
        public bool isTest = false;

        public List<AudioClip> audioClips;

        private AudioSource musicAs;

        public static AudioManager Inst { get; private set; }
        
        [HideInInspector] public float musicVolume;
        [HideInInspector] public float effectVolume;
        
        public Dictionary<string, AudioSource> asDict;

        protected virtual void Awake()
        {
            if (Inst == null)
            {
                Inst = this;
            }
            else if (Inst != this)
            {
                Destroy(gameObject);
            }
            
            musicAs = gameObject.AddComponent<AudioSource>();
            asDict = new Dictionary<string, AudioSource>();
            
            LoadConfig();
        }

        protected virtual void LoadConfig()
        {
            musicVolume = PlayerPrefs.GetFloat("musicVolume", 1f);
            effectVolume = PlayerPrefs.GetFloat("effectVolume", 1f);
        }

        // Start is called before the first frame update
        protected virtual void Start()
        {
            musicAs.loop = true;

            

            this.musicAs.volume = this.musicVolume;
            
            //这里不用更新的。
            foreach (KeyValuePair<string, AudioSource> kvp in asDict)
            {
                kvp.Value.volume = this.effectVolume;
            }
            
            MusicPlay("dlz-flks");
        }

        public void ChangeConfig(float musicVolume, float effectVolume)
        {
            this.musicVolume = musicVolume;
            this.effectVolume = effectVolume;

            this.musicAs.volume = this.musicVolume;
            foreach (KeyValuePair<string, AudioSource> kvp in asDict)
            {
                kvp.Value.volume = this.effectVolume;
            }
        }

        public void SaveConfig()
        {
            PlayerPrefs.SetFloat("musicVolume", this.musicVolume);
            PlayerPrefs.SetFloat("effectVolume", this.effectVolume);
        }

        protected void OnApplicationQuit()
        {
            SaveConfig();
        }

        // Update is called once per frame
        void Update()
        {
#if UNITY_EDITOR

            if (isTest == true)
            {
                if (Input.GetKeyDown(KeyCode.Alpha1))
                {
                    ChangeConfig(0.5f, 0.5f);
                    SaveConfig();
                }
                else if (Input.GetKeyDown(KeyCode.Alpha2))
                {
                    ChangeConfig(1f, 1f);
                    SaveConfig();
                }
                else if (Input.GetKeyDown(KeyCode.Alpha3))
                {
                    ChangeConfig(0f, 0f);
                    SaveConfig();
                }
                else if (Input.GetKeyDown(KeyCode.A))
                {
                    MusicPlay("dlz-flks");
                }
                else if (Input.GetKeyDown(KeyCode.S))
                {
                    EffectPlay("shot");
                }
            }
#endif
        }

        public AudioClip GetAudioClip(string name)
        {
            for (int i = 0; i < audioClips.Count; i++)
            {
                var clip = audioClips[i];
                if (clip.name == name)
                {
                    return clip;
                }
            }

            Debug.Log("Error: Dont' heave the clip " + name);
            return null;
        }

        public void MusicPlayByPath(string filePath)
        {
            var clip = Resources.Load<AudioClip>(filePath);
            MusicPlay(clip);
        }

        public void EffectPlayByPath(string filePath)
        {
            var clip = Resources.Load<AudioClip>(filePath);
            EffectPlay(clip);
        }

        public void MusicPlay(string audioClipName)
        {
            MusicPlay(GetAudioClip(audioClipName));
        }

        public void EffectPlay(string audioClipName)
        {
            EffectPlay(GetAudioClip(audioClipName));
        }
        
        public void MusicPlay2(string audioClipName)
        {
            var clip = ResManager.Inst.LoadAudioClip(audioClipName);
                if(clip!=null) MusicPlay(clip);
        }

        public void EffectPlay2(string audioClipName)
        {
            //print(ResManager.Inst==null);//有时为true有时false
            if (ResManager.Inst == null) return;
     
            var clip = ResManager.Inst.LoadAudioClip(audioClipName);
            if(clip!=null) EffectPlay(clip);
        }

        public void MusicPlay(AudioClip audioClip)
        {
            this.musicAs.clip = audioClip;
            this.musicAs.Play();
        }

        public void EffectPlay(AudioClip audioClip)
        {
            string soundPath = audioClip.name;

            if (asDict.ContainsKey(soundPath) == false)
            {
                var audioSource = gameObject.AddComponent<AudioSource>();

                audioSource.clip = audioClip;

                audioSource.volume = effectVolume;

                asDict.Add(soundPath, audioSource);
            }

            asDict[soundPath].Play();
        }
    }
}