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

namespace Kasizuki
{
	public class ObjectCacheDic
	{
		public ObjectCacheDic()
		{
			this.m_CachedObjectDic = new Dictionary<string, UnityEngine.Object>();
		}

		public T AddCache<T>(string name, T Obj) where T : UnityEngine.Object
		{
			if (this.m_CachedObjectDic == null)
			{
				NDebug.Warning("キャッシュ用配列が未初期化でした。初期化を行います。");
				this.m_CachedObjectDic = new Dictionary<string, UnityEngine.Object>();
			}
			if (Obj == null)
			{
				NDebug.Assert("キャッシュするオブジェクトにnullが指定されました。\n処理を行いません。", false);
			}
			if (string.IsNullOrEmpty(name))
			{
				NDebug.Assert("キャッシュするオブジェクトの名前に空文字が指定されました\n処理を行いません。", false);
			}
			if (this.m_CachedObjectDic.ContainsKey(name))
			{
				NDebug.Assert(string.Format("「{0}」という登録名は既に利用されています。\n処理を行いません。", name), false);
			}
			if (this.m_CachedObjectDic.ContainsValue(Obj))
			{
				NDebug.Assert(string.Format("オブジェクト「{0}」は既に別名で登録されています。\n今回の登録名：「{1}」\n処理を行いません。", Obj.name, name), false);
			}
			this.m_CachedObjectDic.Add(name, Obj);
			return Obj;
		}

		public T GetCache<T>(string name) where T : UnityEngine.Object
		{
			if (this.m_CachedObjectDic == null)
			{
				NDebug.Assert("オブジェクトのキャッシュ用配列が未初期化です。\n処理を行いません。", false);
			}
			if (string.IsNullOrEmpty(name))
			{
				NDebug.Assert("オブジェクトの登録名に空文字が指定されました。\n処理を行いません。", false);
			}
			if (!this.m_CachedObjectDic.ContainsKey(name))
			{
				NDebug.Assert(string.Format("登録名「{0}」は使用されていません。\n処理を行いません。", name), false);
			}
			UnityEngine.Object @object = this.m_CachedObjectDic[name];
			if (@object == null)
			{
				NDebug.Warning(string.Format("登録名「{0}」のデータはnullになっています。\n登録されているオブジェクトは別の処理で削除された可能性があります。\n対応するキーを配列から外します。", name));
				this.RemoveCache(name);
				return (T)((object)null);
			}
			T result = (T)((object)null);
			try
			{
				result = (T)((object)@object);
			}
			catch (InvalidCastException ex)
			{
				NDebug.Assert(string.Format("登録名「{0}」のオブジェクト「{1}」は、「{2}」型にキャストできません。\n\n{3}", new object[]
				{
					name,
					@object.name,
					typeof(T),
					ex.ToString()
				}), false);
			}
			return result;
		}

		public void RemoveCache(string name)
		{
			if (this.m_CachedObjectDic == null)
			{
				NDebug.Assert("オブジェクトのキャッシュ用配列が未初期化です。\n処理を行いません。", false);
			}
			if (string.IsNullOrEmpty(name))
			{
				NDebug.Assert("オブジェクトの登録名に空文字が指定されました。\n処理を行いません。", false);
			}
			if (!this.m_CachedObjectDic.ContainsKey(name))
			{
				NDebug.Warning(string.Format("登録名「{0}」は使用されていません。\n処理を行いません。", name));
				return;
			}
			this.m_CachedObjectDic.Remove(name);
		}

		public T GetChildObject<T>(GameObject target, string name) where T : UnityEngine.Object
		{
			GameObject childObject = UTY.GetChildObject(target, name, false);
			return childObject.GetComponent<T>();
		}

		public T CacheChildObject<T>(GameObject target, string path, string name) where T : UnityEngine.Object
		{
			return this.AddCache<T>(name, this.GetChildObject<T>(target, path));
		}

		public List<string> Keys
		{
			get
			{
				return new List<string>(this.m_CachedObjectDic.Keys);
			}
		}

		public List<UnityEngine.Object> Values
		{
			get
			{
				return new List<UnityEngine.Object>(this.m_CachedObjectDic.Values);
			}
		}

		public Dictionary<string, UnityEngine.Object> Dic
		{
			get
			{
				return this.m_CachedObjectDic;
			}
		}

		private Dictionary<string, UnityEngine.Object> m_CachedObjectDic;
	}
}
