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

using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
	[ActionTarget(typeof(PlayMakerFSM), "gameObject,fsmName")]
    [Tooltip("Gets an item in an Array Variable in another FSM.")]
    public class GetFsmArrayItem : BaseFsmVariableIndexAction
    {
        [RequiredField]
        [Tooltip("The GameObject that owns the FSM.")]
        public FsmOwnerDefault gameObject;

        [UIHint(UIHint.FsmName)]
        [Tooltip("Optional name of FSM on Game Object.")]
        public FsmString fsmName;

        [RequiredField]
        [UIHint(UIHint.FsmArray)]
        [Tooltip("The name of the FSM variable.")]
        public FsmString variableName;

        [Tooltip("The index into the array.")]
        public FsmInt index;

        [RequiredField]
        [UIHint(UIHint.Variable)]
        //[MatchElementType("array")] TODO
        [Tooltip("Get the value of the array at the specified index.")]
        public FsmVar storeValue;

        [Tooltip("Repeat every frame. Useful if the value is changing.")]
        public bool everyFrame;

        public override void Reset()
        {
            gameObject = null;
            fsmName = "";
            storeValue = null;
        }

        public override void OnEnter()
        {
            DoGetFsmArray();

            if (!everyFrame)
            {
                Finish();
            }
        }

        private void DoGetFsmArray()
        {
            var go = Fsm.GetOwnerDefaultTarget(gameObject);
            if (!UpdateCache(go, fsmName.Value))
            {
                return;
            }

            var fsmArray = fsm.FsmVariables.GetFsmArray(variableName.Value);
            if (fsmArray != null)
            {
                if (index.Value < 0 || index.Value >= fsmArray.Length)
                {
                    Fsm.Event(indexOutOfRange);
                    Finish();
                    return;
                }

                if (fsmArray.ElementType == storeValue.NamedVar.VariableType)
                {
                    storeValue.SetValue(fsmArray.Get(index.Value));
                }
                else
                {
                    LogWarning("Incompatible variable type: " + variableName.Value);
                }
            }
            else
            {
                DoVariableNotFound(variableName.Value);
            }
        }

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

    }
}