﻿//----------------------------------------------------------------------------------
// GVRNavi | Garpix Virtual Reality Navigation
// Copyright (c) 2017 Garpix Ltd.
//
// Plugin Homepage: https://gvrnavi.garpix.com
// Author Homepage: https://garpix.com
// Support: support@garpix.com
// License: Asset Store Terms of Service and EULA
// License URI: See LICENSE file in the project root for full license information.
//----------------------------------------------------------------------------------

using UnityEngine;
using UnityEngine.UI;

namespace GVRNavi
{
    [RequireComponent(typeof(BoxCollider))]
    public class VRButtonGaze : VRObjectGaze, IVRColored
    {
        #region variables

        public Image imageRendererBackground;
        public SpriteRenderer spriteRendererBackground;
        public Sprite spriteNormal, spriteHovered;
        public Color colorNormal = Color.white, colorHovered = Color.white;

        protected VRButtonState state
        {
            get { return _state; }
            set
            {
                if (_state != value)
                {
                    _state = value;
                    UpdateSprite();
                }
            }
        }
        public VRTweenColor tweenColor
        {
            get
            {
                if (_tweenColor == null)
                {
                    _tweenColor = gameObject.GetComponent<VRTweenColor>();
                    if (_tweenColor == null)
                        _tweenColor = gameObject.AddComponent<VRTweenColor>();
                }
                return _tweenColor;
            }
        }

        [SerializeField]
        protected VRSpriteType _spriteType;
        protected VRButtonState _state;
        protected VRTweenColor _tweenColor;
        protected float _globalAlpha = 1f;

        #endregion


        protected override void Start()
        {
            base.Start();
            UpdateSprite();
        }

        #region IGvrGazeResponder

        public override void OnGazeEnter()
        {
            base.OnGazeEnter();
            state = VRButtonState.Hovered;
        }

        public override void OnGazeExit()
        {
            base.OnGazeExit();
            state = VRButtonState.Normal;
        }

        #endregion IGvrGazeResponder

        #region IVRColored

        public void SetGlobalAlpha(float alpha)
        {
            _globalAlpha = alpha;
            UpdateColor();
        }

        #endregion IVRColored

        public virtual void UpdateSprite()
        {
            switch (state)
            {
                case VRButtonState.Normal:
                    if (spriteNormal != null)
                    {
                        if (spriteRendererBackground != null)
                            spriteRendererBackground.sprite = spriteNormal;
                        if (imageRendererBackground != null)
                            imageRendererBackground.overrideSprite = spriteNormal;
                    }
                    break;
                case VRButtonState.Hovered:
                    if (spriteHovered != null)
                    {
                        if (spriteRendererBackground != null)
                            spriteRendererBackground.sprite = spriteHovered;
                        if (imageRendererBackground != null)
                            imageRendererBackground.overrideSprite = spriteHovered;
                    }
                    break;
            }
            UpdateColor();
        }

        public virtual void UpdateColor()
        {
            SetColor(state == VRButtonState.Normal ? colorNormal : colorHovered);
        }

        protected virtual void SetColor(Color color)
        {
            color.a *= _globalAlpha;
            SetColliderEnable(color.a > 0f);
            if (Application.isPlaying)
            {
                if (imageRendererBackground != null)
                    tweenColor.StartColoring(imageRendererBackground.color, color, 0.2f, imageRendererBackground);
                if (spriteRendererBackground != null)
                    tweenColor.StartColoring(spriteRendererBackground.color, color, 0.2f, spriteRendererBackground);
            }
            else
            {
                if (imageRendererBackground != null)
                    imageRendererBackground.color = color;
                if (spriteRendererBackground != null)
                    spriteRendererBackground.color = color;
            }
        }
    }
}