/*This script has been, partially or completely, generated by the Fungus.GenerateVariableWindow*/

// This code is part of the Fungus library (https://github.com/snozbot/fungus)
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)

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

namespace Fungus
{
    // <summary>
    /// Get or Set a property of a Transform component
    /// </summary>
    [CommandInfo("Property",
                 "Transform",
                 "Get or Set a property of a Transform component")]
    [AddComponentMenu("")]
    public class TransformProperty : BaseVariableProperty
    {
		//generated property
        public enum Property 
        { 
            ChildCount, 
            EulerAngles, 
            Forward, 
            HasChanged, 
            HierarchyCapacity, 
            HierarchyCount, 
            LocalEulerAngles, 
            LocalPosition, 
            LocalScale, 
            LossyScale, 
            Parent, 
            Position, 
            Right, 
            Root, 
            Up, 
            Rotation, 
            LocalRotation, 
            WorldToLocalMatrix, 
            LocalToWorldMatrix, 
        }

		
        [SerializeField]
        protected Property property = Property.Position;

        [SerializeField]
        protected TransformData transformData;

        [SerializeField]
        [VariableProperty(typeof(Vector3Variable),
                          typeof(QuaternionVariable),
                          typeof(TransformVariable),
                          typeof(Matrix4x4Variable),
                          typeof(IntegerVariable),
                          typeof(BooleanVariable))]
        protected Variable inOutVar;

        public override void OnEnter()
        {
            var iov = inOutVar as Vector3Variable;
            var ioq = inOutVar as QuaternionVariable;
            var iot = inOutVar as TransformVariable;
            var iom4 = inOutVar as Matrix4x4Variable;
            var ioi = inOutVar as IntegerVariable;
            var iob = inOutVar as BooleanVariable;

            var target = transformData.Value;

            switch (getOrSet)
            {
                case GetSet.Get:
                    switch (property)
                    {
                        case Property.Position:
                            iov.Value = target.position;
                            break;
                        case Property.LocalPosition:
                            iov.Value = target.localPosition;
                            break;
                        case Property.EulerAngles:
                            iov.Value = target.eulerAngles;
                            break;
                        case Property.LocalEulerAngles:
                            iov.Value = target.localEulerAngles;
                            break;
                        case Property.Right:
                            iov.Value = target.right;
                            break;
                        case Property.Up:
                            iov.Value = target.up;
                            break;
                        case Property.Forward:
                            iov.Value = target.forward;
                            break;
                        case Property.Rotation:
                            ioq.Value = target.rotation;
                            break;
                        case Property.LocalRotation:
                            ioq.Value = target.localRotation;
                            break;
                        case Property.LocalScale:
                            iov.Value = target.localScale;
                            break;
                        case Property.Parent:
                            iot.Value = target.parent;
                            break;
                        case Property.WorldToLocalMatrix:
                            iom4.Value = target.worldToLocalMatrix;
                            break;
                        case Property.LocalToWorldMatrix:
                            iom4.Value = target.localToWorldMatrix;
                            break;
                        case Property.Root:
                            iot.Value = target.root;
                            break;
                        case Property.ChildCount:
                            ioi.Value = target.childCount;
                            break;
                        case Property.LossyScale:
                            iov.Value = target.lossyScale;
                            break;
                        case Property.HasChanged:
                            iob.Value = target.hasChanged;
                            break;
                        case Property.HierarchyCapacity:
                            ioi.Value = target.hierarchyCapacity;
                            break;
                        case Property.HierarchyCount:
                            ioi.Value = target.hierarchyCount;
                            break;
                        default:
                            Debug.Log("Unsupported get or set attempted");
                            break;
                    }
                    break;
                case GetSet.Set:
                    switch (property)
                    {
                        case Property.Position:
                            target.position = iov.Value;
                            break;
                        case Property.LocalPosition:
                            target.localPosition = iov.Value;
                            break;
                        case Property.EulerAngles:
                            target.eulerAngles = iov.Value;
                            break;
                        case Property.LocalEulerAngles:
                            target.localEulerAngles = iov.Value;
                            break;
                        case Property.Right:
                            target.right = iov.Value;
                            break;
                        case Property.Up:
                            target.up = iov.Value;
                            break;
                        case Property.Forward:
                            target.forward = iov.Value;
                            break;
                        case Property.Rotation:
                            target.rotation = ioq.Value;
                            break;
                        case Property.LocalRotation:
                            target.localRotation = ioq.Value;
                            break;
                        case Property.LocalScale:
                            target.localScale = iov.Value;
                            break;
                        case Property.Parent:
                            target.parent = iot.Value;
                            break;
                        case Property.HasChanged:
                            target.hasChanged = iob.Value;
                            break;
                        case Property.HierarchyCapacity:
                            target.hierarchyCapacity = ioi.Value;
                            break;
                        default:
                            Debug.Log("Unsupported get or set attempted");
                            break;
                    }
                    break;
                default:
                    break;
            }

            Continue();
        }

        public override string GetSummary()
        {
            if (transformData.Value == null)
            {
                return "Error: no transform set";
            }
            if (inOutVar == null)
            {
                return "Error: no variable set to push or pull data to or from";
            }

            //We could do further checks here, eg, you have selected childcount but set a vec3variable

            return getOrSet.ToString() + " " + property.ToString();
        }

        public override Color GetButtonColor()
        {
            return new Color32(235, 191, 217, 255);
        }

        public override bool HasReference(Variable variable)
        {
            if (transformData.transformRef == variable || inOutVar == variable)
                return true;

            return false;
        }

    }
}