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

public class PlayerBehavior : MonoBehaviour {

    /* Movement to apply this frame */
    private Vector3 frameMovement;

    /* How much force is applied by player movement */
    [SerializeField]
    private float acceleration;

    /* How much the velocity is scaled down on brake */
    [SerializeField]
    private float brakeFraction;
    [SerializeField]
    private float constantFraction;

    /* The maximum speed a player is allowed to go */
    [SerializeField]
    private float maxSpeed;

    /* Holds our plaayer and player body */
    public GameObject player;
    private Rigidbody2D playerBody;


    /* Getters and Setters */
    public float getMaxSpeed()
    {
        return maxSpeed;
    }

    /**
     *  Collection of basic movement functions that add to a movement vector, which is 
     *      reset every frame.
     */
    public void MoveLeft()
    {
        frameMovement.x -= acceleration;
    }

    public void MoveRight()
    {
        frameMovement.x += acceleration;
    }

    public void MoveUp()
    {
        frameMovement.y += acceleration;
    }

    public void MoveDown()
    {
        frameMovement.y -= acceleration;
    }

    /**
     * Scale the player's velocity down, if brakeFraction is < zero 
     */
    public void Brake()
    {
        playerBody.velocity *= brakeFraction;
    }


    // Use this for initialization
    void Start () {
        playerBody = this.GetComponent<Rigidbody2D>();
	}
	
	// Update is called once per frame
	void Update () {
        /* Accelerate the player with a movement vector based on this frames input */
        playerBody.AddForce(frameMovement.normalized * acceleration);

        /* Cap player speed with a velocity check */
        if (playerBody.velocity.magnitude > maxSpeed)
            playerBody.velocity = (playerBody.velocity.normalized * maxSpeed);
        
        /* Apply some simple friction */
        playerBody.velocity *= constantFraction;

        /* Reset any persistant variables */
        frameMovement = Vector3.zero;
	}
}