﻿//----------------------------------------------------------------------------------
// 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 GVRNavi;

[RequireComponent(typeof(Rigidbody))]
public class VRPlayerController : MonoBehaviour
{
    #region variables

    public bool isMovingEnabled
    {
        get { return _isMovingEnabled; }
        set { _isMovingEnabled = value; }
    }

    public bool isMovingEnabledAtStart = true;
    public float movingSpeedMin = 0.5f;
    public float movingSpeedMax = 2.5f;
    public float movingAccelerationPerSecond = 1f;
    public float movingDecelerationPerSecond = 4f;
    public Camera playerCamera;
    public SpriteRenderer sprite;
    public Sprite spriteStandard, spriteMoving;
    public VRScrollBarGaze scrollBar;

    private bool _isMovingEnabled = true;
    private float _currentMovingSpeed = 0f;
    private float _currentMaxSpeedValue = 0.5f;
    private float _currentMaxSpeed;
    private Rigidbody _rigidbody;

    #endregion


    void Start()
    {
        _rigidbody = GetComponent<Rigidbody>();
        isMovingEnabled = isMovingEnabledAtStart;
        _currentMaxSpeed = Mathf.Lerp(movingSpeedMin, movingSpeedMax, _currentMaxSpeedValue);
        if (scrollBar != null)
            scrollBar.OnValueChanged.AddListener(OnPlayerSpeedScrollBarValueChanged);
    }

    void OnDestroy()
    {
        if (scrollBar != null)
            scrollBar.OnValueChanged.RemoveListener(OnPlayerSpeedScrollBarValueChanged);
    }
	
	void Update()
    {
        if (isMovingEnabled)
        {
            if (_currentMovingSpeed < _currentMaxSpeed)
                _currentMovingSpeed = Mathf.Clamp(_currentMovingSpeed + movingAccelerationPerSecond * Time.deltaTime, 0, _currentMaxSpeed);
            _rigidbody.velocity = playerCamera.transform.forward * _currentMovingSpeed;
        } else if (_currentMovingSpeed > 0)
        {
            _currentMovingSpeed = Mathf.Clamp(_currentMovingSpeed - movingDecelerationPerSecond * Time.deltaTime, 0, _currentMaxSpeed);
            _rigidbody.velocity = playerCamera.transform.forward * _currentMovingSpeed;
        }
	}

    public void ChangeEnableState()
    {
        isMovingEnabled = !isMovingEnabled;
    }

    public void SetMovingMode()
    {
        isMovingEnabled = true;
    }

    public void SetStandMode()
    {
        isMovingEnabled = false;
    }

    public void SetSpriteStandard()
    {
        sprite.sprite = spriteStandard;
    }

    public void SetSpriteMoving()
    {
        sprite.sprite = spriteMoving;
    }
    
    private void OnPlayerSpeedScrollBarValueChanged(VRObjectGaze scroll, float value)
    {
        _currentMaxSpeedValue = Mathf.Clamp(value, 0f, 1f);
        _currentMaxSpeed = Mathf.Lerp(movingSpeedMin, movingSpeedMax, _currentMaxSpeedValue);
    }
}