/*
 * File:			GAFCustomResourceDelegate.cs
 * Version:			1.0
 * Last changed:	2014/12/2 12:43
 * Author:			Alexey_Nikitin
 * Copyright:		© GAF Media
 * Project:			UnityVS.UnityProject.CSharp
 */

using UnityEngine;

using GAF.Assets;
using GAF.Utils;

namespace GAF.Core
{
	[System.Serializable]
	public class GAFCustomResourceDelegate
	{
		#region Members

		[GAFFuncAttribute(typeof(GAFTexturesResource), typeof(string))]
		[HideInInspector][SerializeField] private GAFFuncData	m_Data			= new GAFFuncData();
		[HideInInspector][SerializeField] private bool			m_ReloadFunc	= false;

		private System.Func<string, GAFTexturesResource> m_Func = null;

		#endregion Members

		#region Interface

		public System.Func<string, GAFTexturesResource> func
		{
			get
			{
				if (m_Func == null || m_ReloadFunc)
				{
					loadFunc();
				}

				return m_Func;
			}

			set
			{
				m_Func = value;

				if (value == null)
				{
					m_Data.clear();
				}
			}
		}

		public GAFFuncData funcData
		{
			get
			{
				return m_Data;
			}

			set
			{
				if (m_Data != value)
				{
					m_Data = value;
					m_Func = null;
				}
			}
		}

		#endregion // Interface

		#region Implementation

		private void loadFunc()
		{
			m_ReloadFunc = false;

			if (m_Data.target != null && m_Data.method != "None")
			{
				try
				{
#if UNITY_WINRT && !UNITY_EDITOR

#if NETFX_CORE
					m_Func = System.Func<string, GAFTexturesResource>.CreateDelegate(
						  typeof(System.Func<string, GAFTexturesResource>)
						, m_Data.target
						, m_Data.target.GetTypeInfo().GetDeclaredMethod(m_Data.method)) as System.Func<string, GAFTexturesResource>;
#else
					m_Func = System.Func<string, GAFTexturesResource>.CreateDelegate(
						typeof(System.Func<string, GAFTexturesResource>)
						, m_Data.target
						, m_Data.target.GetType().GetMethod(m_Data.method)) as System.Func<string, GAFTexturesResource>;
#endif // NETFX_CORE

#else
					m_Func = System.Func<string, GAFTexturesResource>.CreateDelegate(
						  typeof(System.Func<string, GAFTexturesResource>)
						, m_Data.target
						, m_Data.target.GetType().GetMethod(m_Data.method)) as System.Func<string, GAFTexturesResource>;
#endif // UNITY_WP8 || UNITY_METRO
				}
				catch
				{
					m_Data.clear();
					m_Func = null;
				}
			}
			else if (m_Data.targetType != null && m_Data.method != "None")
			{
				try
				{
					var targetType = System.Type.GetType(m_Data.targetType);
					m_Func = System.Func<string, GAFTexturesResource>.CreateDelegate(
						  typeof(System.Func<string, GAFTexturesResource>)
						, null
						, targetType.GetMethod(m_Data.method)) as System.Func<string, GAFTexturesResource>;
				}
				catch
				{
					m_Data.clear();
					m_Func = null;
				}
			}
			else
			{
				m_Func = null;
			}
		}

		#endregion // Implementation
	}
}