using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.U2D;

namespace MPStudio
{
    public interface IAssetFactory
    {
        AudioClip LoadAudioClip(string name);
        Sprite LoadSprite(string name);
        Material LoadMaterial(string name);
        Font LoadFont(string name);
        TextAsset LoadTextAsset(string name);
        SpriteAtlas LoadSpriteAtlas(string name);
        GameObject LoadGameObject(string name);
        T LoadScriptableObject<T>(string name) where T : ScriptableObject;
        public GameObject LoadPool(string name);
        public Sprite LoadAtlasSprite(string name);
    }
    
    [DisallowMultipleComponent]
    [DefaultExecutionOrder(-1)]
    public class ResManager : MonoBehaviour, IAssetFactory
    {
        private Dictionary<string, AudioClip> _audioClips = new Dictionary<string, AudioClip>();

        public static ResManager Inst { get; private set; }
        protected virtual void Awake()
        {
            if (Inst == null)
            {
                Inst = this;
            }
            else if (Inst != this)
            {
                Destroy(gameObject);
            }
        }
        
        protected virtual void Start()
        {
            GameSet gset = LoadScriptableObject<GameSet>("GameSet");
          //  print("rank:"+gset.rank);
        }

        public T LoadJson<T>(string txtName) where T : class
        {
            T res = default;

            return res;
        }

        public AudioClip LoadAudioClip(string name)
        {
            //print(name);
            if (_audioClips.ContainsKey(name) == false)
            {
                _audioClips.Add(name, Resources.Load<AudioClip>(Path.Combine("Audio", name)));
            }

            return _audioClips[name];
        }

        public Sprite LoadSprite(string name)
        {
            return Resources.Load<Sprite>(Path.Combine("Sprite", name));
        }

        public Material LoadMaterial(string name)
        {
            return Resources.Load<Material>(Path.Combine("Material", name));
        }

        public Font LoadFont(string name)
        {
            return Resources.Load<Font>(Path.Combine("Font", name));
        }

        public TextAsset LoadTextAsset(string name)
        {
            return Resources.Load<TextAsset>(Path.Combine("Text", name));
        }

        public SpriteAtlas LoadSpriteAtlas(string name)
        {
            return Resources.Load<SpriteAtlas>(Path.Combine("SpriteAtlas", name));
        }

        public GameObject LoadGameObject(string name)
        {
            return Resources.Load<GameObject>(Path.Combine("Prefab", name));
        }

        public T LoadScriptableObject<T>(string name) where T : ScriptableObject
        {
            return Resources.Load<T>(Path.Combine("SObj", name));
        }
        
        public GameObject LoadPool(string name)
        {
            return Resources.Load<GameObject>(Path.Combine("PoolObj", name));
        }

        public Sprite LoadAtlasSprite(string name)
        {
            return Resources.Load<Sprite>(Path.Combine("AtlasSprite", name));
        }
    }
}