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

[SelectionBase]
public class PlayerController : MonoBehaviour {
    public float Speed = 5;
    public float Gravity = 7;

    private CharacterController charC;
    private AnimationHandler anim;
	// Use this for initialization
	void Start () {
        charC = GetComponent<CharacterController>();
        anim = GetComponent<AnimationHandler>();
	}

    private float velY = 0;
	
	// Update is called once per frame
	void Update () {
        Vector3 dir = new Vector3();
        if (input != null)
        {
            if (charC.isGrounded)
            {
                dir.x = input.Axis(InputSource<PlayerController>.InputAxis.MoveX);
                dir.z = input.Axis(InputSource<PlayerController>.InputAxis.MoveY);

                if (dir.magnitude > 0.3f)
                {
                    dir.Normalize();
                    dir *= Speed;

                    float angle = Mathf.Atan2(dir.z, dir.x);

                    if (angle < 0) angle += Mathf.PI * 2;

                    if (angle < Mathf.PI / 2.0f) anim.SetDir(AnimationHandler.Direction.UpRight);
                    if (angle < Mathf.PI && angle >= Mathf.PI / 2.0f) anim.SetDir(AnimationHandler.Direction.UpLeft);
                    if (angle < Mathf.PI * 3.0f / 2.0f && angle >= Mathf.PI) anim.SetDir(AnimationHandler.Direction.DownLeft);
                    if (angle >= Mathf.PI * 3.0f / 2.0f) anim.SetDir(AnimationHandler.Direction.DownRight);

                    //Debug.Log("ANGLE: " + angle);
                }
                else
                {
                    dir.x = 0;
                    dir.z = 0;
                }
            }
        }

        dir.y = velY;

        velY -= Gravity * Time.deltaTime;

        gameObject.layer = LayerMask.NameToLayer("player_controller_no_collide");
        charC.Move(dir * Time.deltaTime);
        gameObject.layer = LayerMask.NameToLayer("player_controller");

        if (charC.isGrounded)
        {
            velY = 0;
        }
	}

    private InputSource<PlayerController> input = null;
    private InputManager.PlayerInfo playerInfo;
    public void SetInput(InputSource<PlayerController> newPlayerInput, InputManager.PlayerInfo playerInfo)
    {
        this.input = newPlayerInput;
        this.playerInfo = playerInfo;
    }
}
