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

namespace JLGames.RocketDriver.Actions.Audio
{
    public static class AudioManagerPool
    {
        public const string DefaultManagerNamed = "AudioManagerShared";

        private static IAudioManager m_Shared;
        private static readonly Dictionary<string, IAudioManager> m_AudioManagerMap = new Dictionary<string, IAudioManager>();

        public static IAudioManager Shared
        {
            get
            {
                if (null != m_Shared)
                {
                    return m_Shared;
                }

                if (m_AudioManagerMap.ContainsKey(DefaultManagerNamed))
                {
                    m_Shared = m_AudioManagerMap[DefaultManagerNamed];
                }
                else
                {
                    m_Shared = InnerCreateManager();
                }

                return m_Shared;
            }
        }

        public static IAudioManager GetInstance(string named)
        {
            return m_AudioManagerMap.ContainsKey(named) ? m_AudioManagerMap[named] : null;
        }

        public static bool AddToMap(IAudioManager audioManager)
        {
            if (m_AudioManagerMap.ContainsKey(audioManager.Named))
            {
                throw new Exception("Repeat AudioManager named");
            }

            m_AudioManagerMap.Add(audioManager.Named, audioManager);
            return true;
        }

        public static bool RemoveFromMap(AudioManager am)
        {
            if (!m_AudioManagerMap.ContainsKey(am.Named))
            {
                return false;
            }

            m_AudioManagerMap.Remove(am.Named);
            return true;
        }

        public static bool RemoveFromMap(string name)
        {
            if (!m_AudioManagerMap.ContainsKey(name))
            {
                return false;
            }

            m_AudioManagerMap.Remove(name);
            return true;
        }

        private static IAudioManager InnerCreateManager()
        {
            var obj = new GameObject(DefaultManagerNamed);
            var manager = obj.AddComponent<AudioManager>();
            manager.Named = DefaultManagerNamed;
            var settings = Resources.Load<AudioSettings>(AudioManager.DefaultSettingsNamed);
            manager.InitManager(settings);
            return manager;
        }
    }
}