﻿// (c) Copyright HutongGames, LLC 2010-2018. All rights reserved.
// original action by Nuclear Napalm Entertainment LLC: http://hutonggames.com/playmakerforum/index.php?topic=10581.msg49831#msg49831

using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
	[ActionCategory(ActionCategory.UI)]
	[Tooltip("Sets properties of a UI CanvasGroup component.")]
	public class UiCanvasGroupSetProperties : ComponentAction<CanvasGroup>
	{
		[RequiredField]
		[CheckForComponent(typeof(CanvasGroup))]
		[Tooltip("The GameObject with the UI CanvasGroup component.")]
		public FsmOwnerDefault gameObject;

		[Tooltip("Canvas group alpha. Ranges from 0.0 to 1.0.")]
		[HasFloatSlider(0f,1f)]
		public FsmFloat alpha;

		[Tooltip("Is the group interactable (are the elements beneath the group enabled). Leave as None for no effect")]
		public FsmBool interactable;

		[Tooltip("Does this group block raycasting (allow collision). Leave as None for no effect")]
		public FsmBool blocksRaycasts;

		[Tooltip("Should the group ignore parent groups? Leave as None for no effect")]
		public FsmBool ignoreParentGroup;
		
		[Tooltip("Reset when exiting this state. Leave as None for no effect")]
		public FsmBool resetOnExit;

		public bool everyFrame;

	    private CanvasGroup component;

	    private float originalAlpha;
	    private bool originalInteractable;
	    private bool originalBlocksRaycasts;
	    private bool originalIgnoreParentGroup;

		public override void Reset()
		{
			gameObject = null;
			alpha = new FsmFloat {UseVariable=true};
			interactable = new FsmBool {UseVariable=true};
			blocksRaycasts = new FsmBool {UseVariable=true};
			ignoreParentGroup = new FsmBool {UseVariable=true};
			resetOnExit = null;
			everyFrame = false;
		}

		public override void OnEnter()
		{
			var go = Fsm.GetOwnerDefaultTarget(gameObject);
			if (UpdateCache(go))
			{
				component = cachedComponent;
			    if (component != null)
			    {
			        originalAlpha = component.alpha;
			        originalInteractable = component.interactable;
			        originalBlocksRaycasts = component.blocksRaycasts;
			        originalIgnoreParentGroup = component.ignoreParentGroups;
			    }
			}
			
			DoAction();
			
			if (!everyFrame)
			{
				Finish();
			}
		}

		public override void OnUpdate()
		{
			DoAction();
		}

	    private void DoAction()
		{
		    if (component == null) return;

		    if (!alpha.IsNone)
		    {
		        component.alpha = alpha.Value;
		    }
		    if (!interactable.IsNone)
		    {
		        component.interactable = interactable.Value;
		    }
		    if (!blocksRaycasts.IsNone)
		    {
		        component.blocksRaycasts = blocksRaycasts.Value;
		    }
		    if (!ignoreParentGroup.IsNone)
		    {
		        component.ignoreParentGroups = ignoreParentGroup.Value;
		    }
		}
		
		public override void OnExit()
		{
			if (component==null) return;
			
			if (resetOnExit.Value)
			{
				if (!alpha.IsNone)
				{
					component.alpha = originalAlpha;
				}
				if (!interactable.IsNone)
				{
					component.interactable = originalInteractable;
				}
				if (!blocksRaycasts.IsNone)
				{
					component.blocksRaycasts = originalBlocksRaycasts;
				}
				if (!ignoreParentGroup.IsNone)
				{
					component.ignoreParentGroups = originalIgnoreParentGroup;
				}
			}
		}
	}
}
