#if GRIFFIN
using UnityEngine;

namespace Pinwheel.Griffin
{
    [System.Serializable]
    public struct GTreeInstance
    {
        [SerializeField]
        internal int prototypeIndex;
        public int PrototypeIndex
        {
            get
            {
                return prototypeIndex;
            }
            set
            {
                prototypeIndex = value;
            }
        }

        [SerializeField]
        internal Vector3 position;
        public Vector3 Position
        {
            get
            {
                return position;
            }
            set
            {
                position = value;
            }
        }

        [SerializeField]
        internal Quaternion rotation;
        public Quaternion Rotation
        {
            get
            {
                return rotation;
            }
            set
            {
                rotation = value;
            }
        }

        [SerializeField]
        internal Vector3 scale;
        public Vector3 Scale
        {
            get
            {
                return scale;
            }
            set
            {
                scale = value;
            }
        }

        public static GTreeInstance Create(int prototypeIndex)
        {
            GTreeInstance tree = new GTreeInstance();
            tree.PrototypeIndex = prototypeIndex;
            tree.Position = Vector3.zero;
            tree.Rotation = Quaternion.identity;
            tree.Scale = Vector3.one;

            return tree;
        }

        public static explicit operator GTreeInstance(TreeInstance t)
        {
            GTreeInstance tree = Create(t.prototypeIndex);
            tree.Position = t.position;
            tree.Rotation = Quaternion.Euler(0, t.rotation * Mathf.Rad2Deg, 0);
            tree.Scale = new Vector3(t.widthScale, t.heightScale, t.widthScale);

            return tree;
        }

        public static explicit operator TreeInstance(GTreeInstance t)
        {
            TreeInstance tree = new TreeInstance();
            tree.prototypeIndex = t.PrototypeIndex;
            tree.position = t.Position;
            tree.widthScale = t.Scale.x;
            tree.heightScale = t.Scale.y;
            tree.color = Color.white;

            return tree;
        }

        internal static int GetStructSize()
        {
            return sizeof(int) + sizeof(float) * 3 + sizeof(float) * 4 + sizeof(float) * 3;
        }
    }
}
#endif