using System.Collections;
using System.Collections.Generic;
using System.IO;
using LitJson;

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);

        T LoadJsonObj<T>(string name) where T : class;
    }
    
    [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);
          
          TestSObjAndJson();
        }

        public void TestSObjAndJson()
        {
            /*
            var obj1 = LoadScriptableObject<TestScriptableObj>("TestScriptableObj");
            print(obj1.quaternion);
            var obj2 = LoadJsonObj<TestScriptableObj>("TestScriptableObj");
            print(obj2.quaternion);
            */
            
            /*
            var obj1 = LoadScriptableObject<GameSet>("GameSet");
            print(obj1.vk==VerKind.B);
            var obj2 = LoadJsonObj<GameSet>("GameSet");
            print(obj2.vk==VerKind.B);
            */
        }


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

            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));
        }

        public T LoadJsonObj<T>(string name) where T : class
        {
           var jsonStr= Resources.Load<TextAsset>(Path.Combine("JSON", name));
           if (jsonStr != null)
           {
               return JsonMapper.ToObject<T>(jsonStr.text);
           }
           else
           {
               return default;
           }
        }
        
        
        
        

    }
}