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

public class PlayerMovement : MonoBehaviour {
	GameObject[] characters;//Todos los personajes del escenario
	public bool isPlaying = false;//Saber si el "this" está activo
	float maxSpeed = 5f;//Sera nuestra limitante de maxima velocidad
	float speed = 4f;//Fuerza para el vector de velocidad del personaje
	bool grounded; // * Checar si está en el suelo 
	//Variables para el salto, jumpPower fuerza de salto
	float jumpPower = 4f; //Poder de salto
	float stairsPower = 1.2f;
	bool isJumping; //Saber si está brincando
	bool canJump;//Saber si podemos brinca AKA está en el suelo
	private Rigidbody2D rb2d; //Encontrar el ribidbody del object
	private Animator anim;//Encontrar el animator del object
	private int direction = 2; // 2 = derecha, 1 = izquierda
	private bool isTouchingStairs;
	Collider2D coll;
    Vector2 mov;
	float jumpVelocity;

    // Use this for initialization
    void Start () {
		//Encontrar todos los personajes y guardarlos en un array
		characters = GameObject.FindGameObjectsWithTag("Player");
		//Detectamos la direccion hacia donde nos movemos
		rb2d = GetComponent<Rigidbody2D> ();
		anim = GetComponent<Animator> ();
		//Deshabilitamos la rotación
		rb2d.freezeRotation = true;
		canJump = true;
		isJumping = false;
		isTouchingStairs = false;
		coll = GetComponent<Collider2D> ();
	}

	// Update is called once per frame
	void Update () {
		//PUT MOVEMENT CODE HERE
		if (isPlaying) {
			//Asignamos la tecla a para saltar y activamos el salto
			if (Input.GetKeyDown (KeyCode.Space) ) {
				if (!isJumping && canJump) {
                    canJump = false;
					isJumping = true;
				}
			}
            /*Detectara cuando se presione el eje horizontal
			 Guarda valores desde -1 a 1*/
			mov = new Vector2 (
				Input.GetAxisRaw ("Horizontal"),
				rb2d.velocity.y
			);
        }

	}

	void Acciones () {
	}

	//Soluciona problemas que se generan al usar fisicas
	//Y ya no es necesario multiplicar la velocidad de movimiento por el
	//Framerate del juego
	void FixedUpdate(){
		if (isPlaying) {
            checkAnimations ();
			walking ();
		}

	}


	//MARK: - Movements
	void walking(){

        //Obtenemos la velocidad en la que se movera en el eje horizontal
        //Fuerza fisica aplicada
        //rb2d.AddForce (Vector2.right * speed * h);
        //Fuerza no, posiciones si.
		if (mov != Vector2.zero) {
			rb2d.MovePosition (rb2d.position + mov * speed * Time.deltaTime);
			anim.SetBool ("walking", true);
		} 
		else {
			anim.SetBool ("walking", false);
		}			
        //La funcion clamp toma una variable y le aplica un filtro
        //float limitedSpeed = Mathf.Clamp (rb2d.velocity.x, -maxSpeed, maxSpeed);
		//rb2d.velocity = new Vector2 (limitedSpeed, rb2d.velocity.y);

		if (isJumping) {
            //Indicamos que la furza sera un impulso
			rb2d.velocity = new Vector2 (0, jumpPower);
			//rb2d.AddForce(new Vector2(0,1) * jumpPower, ForceMode2D.Force);
            isJumping = false;
		}

		if (isTouchingStairs) {
			/*if (Input.GetKeyDown (KeyCode.W)) {
				rb2d.AddForce (Vector2.up * speed * v);
				rb2d.velocity = new Vector2 (limitedSpeed, rb2d.velocity.y);
			}
			if (Input.GetKeyDown (KeyCode.S)) {
				rb2d.AddForce (Vector2.up * speed * v);
			}*/

			mov = new Vector2 (
                Input.GetAxisRaw("Horizontal"),
				Input.GetAxisRaw ("Vertical")
			);

            rb2d.MovePosition(rb2d.position + mov * speed * Time.deltaTime);
        }
	
	}

	void checkAnimations(){
		anim.SetFloat ("movx", mov.x);
		/*if (Input.GetKeyDown (KeyCode.A) ) {
			anim.SetInteger("Direction", 2);
			direction = 2;
		}
		else if (Input.GetKeyDown (KeyCode.D) ) {
			anim.SetInteger("Direction", 1);
			direction = 1;
		}*/
	}


	//MARK: - Cambiar personaje
	void OnMouseDown(){
		//Poner todos los personajes en false para que no puedan moverse
		foreach (GameObject character in characters)
		{
			PlayerMovement pm = character.GetComponent<PlayerMovement> ();//Get characters script
			pm.isPlaying = false;
		}

		//Poner nuestro personaje en true para que pueda moverse
		isPlaying = true;

		//Decirle a la cámara que nos siga
		ChangePlayer c = Camera.main.GetComponent<ChangePlayer>();
		c.characterToFollow = this.gameObject;

	}   

	//Check collisions
	void OnCollisionEnter2D(Collision2D collision) {
		if (isPlaying) {
			if (collision.gameObject.tag == "Floor"){
				canJump = true;

            }
		}
	}
    

    void OnTriggerExit2D(Collider2D other){
		if (isPlaying) {
			if (other.gameObject.tag == "Stairs") {
				isTouchingStairs = false;
                coll.attachedRigidbody.gravityScale = 1;
				canJump = true;
			} 

		}
	}

	void OnTriggerEnter2D(Collider2D other){
		if (isPlaying) {
			if (other.gameObject.tag == "Stairs") {
				print ("Trigger");
				isTouchingStairs = true;
				coll.attachedRigidbody.gravityScale = 0;
				canJump = false;
			}
		}

	}




}
