// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.

using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
	[ActionCategory(ActionCategory.ScriptControl)]
	[Tooltip("Enables/Disables a Behaviour on a GameObject. Optionally reset the Behaviour on exit - useful if you want the Behaviour to be active only while this state is active.")]
	public class EnableBehaviour : FsmStateAction
	{
		[RequiredField]
        [Tooltip("The GameObject that owns the Behaviour.")]
		public FsmOwnerDefault gameObject;
		
		[UIHint(UIHint.Behaviour)]
        [Tooltip("The name of the Behaviour to enable/disable.")]
		public FsmString behaviour;
		
		[Tooltip("Optionally drag a component directly into this field (behavior name will be ignored).")]
		public Component component;
		
		[RequiredField]
        [Tooltip("Set to True to enable, False to disable.")]
		public FsmBool enable;
		
		public FsmBool resetOnExit;

		public override void Reset()
		{
			gameObject = null;
			behaviour = null;
			component = null;
			enable = true;
			resetOnExit = true;
		}

		Behaviour componentTarget;

		public override void OnEnter()
		{
			DoEnableBehaviour(Fsm.GetOwnerDefaultTarget(gameObject));
			
			Finish();
		}

		void DoEnableBehaviour(GameObject go)
		{
			if (go == null)
			{
				return;
			}

			if (component != null)
			{
				componentTarget = component as Behaviour;
			}
			else
			{
				componentTarget = go.GetComponent(ReflectionUtils.GetGlobalType(behaviour.Value)) as Behaviour;
			}

			if (componentTarget == null)
			{
				LogWarning(" " + go.name + " missing behaviour: " + behaviour.Value);
				return;
			}

			componentTarget.enabled = enable.Value;
		}

		public override void OnExit()
		{
			if (componentTarget == null)
			{
				return;
			}

			if (resetOnExit.Value)
			{
				componentTarget.enabled = !enable.Value;
			}
		}

	    public override string ErrorCheck()
	    {
	        var go = Fsm.GetOwnerDefaultTarget(gameObject);

	        if (go == null || component != null || behaviour.IsNone || string.IsNullOrEmpty(behaviour.Value))
	        {
	            return null;
	        }

	        var comp = go.GetComponent(ReflectionUtils.GetGlobalType(behaviour.Value)) as Behaviour;
	        return comp != null ? null : "Behaviour missing";
	    }
	}
}