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

public class PlayerMovements : MonoBehaviour
{
    [Header ("Movements------------------------------------")]
    
    [SerializeField] private float speedForce = 9f;
    [SerializeField] private float jumpHeight = 0.8f;
    [SerializeField] private float gravityJump = 4.2f;
    [SerializeField] private float gravityDown = 4.2f;
    [SerializeField] private Transform cam;

    [Header ("RunningStaminaBar------------------------------------")]

    [SerializeField] private Slider staminaBar;
    [SerializeField] private float runningCost = 0.25f;
    [SerializeField] private float staminaRegenerationValue = 0.3f;
    
    [Header("GroundCheck------------------------------------")]

    [SerializeField] private LayerMask groundLayer;
    [SerializeField] private float raycastCheckDistance = 1.65f;

    [Header("CharacterAnimator------------------------------------")]

    [SerializeField] private Animator animator;

    //-----------------------------------------------------------------------------------------------------
    private float maxStamina = 1f;
    private float actualStamina;
    private float staminaRegenerationCooldown;
    private bool staminaBarIsUsed;
    private CharacterController controller;
    private float turnSmoothTime = 0.1f;
    private float turnSmoothVelocity;
    private float downwardForce;
    private bool isGrounded;
    private Vector3 velocity;
   
    
    private void Start()
    {
        controller = GetComponent<CharacterController>();
        Cursor.lockState = CursorLockMode.Locked;
        actualStamina = maxStamina;
        staminaBar.maxValue = maxStamina;
    }
    //-----------------------------------------------------------------------------------------------------
    private void Update()
    {
        
        isGrounded = Physics.Raycast(transform.position,transform.TransformDirection (Vector3.down), raycastCheckDistance, groundLayer);

        float horizontalInput = Input.GetAxisRaw("Horizontal");
        float verticalInput = Input.GetAxisRaw("Vertical");

        Vector3 direction = new Vector3(horizontalInput, 0f, verticalInput).normalized;
        velocity = new Vector3(horizontalInput, 0f, verticalInput).normalized;
        float moveValue = Mathf.Abs(horizontalInput) + Mathf.Abs(verticalInput);

        animator.SetBool("isGrounded", isGrounded);

        if (isGrounded && velocity.y <= 0f)
        {
            downwardForce = 0f;
        }
        else
        {
            downwardForce += Physics.gravity.y * gravityDown * Time.deltaTime;
          
        }
        
        if (isGrounded && Input.GetButtonDown("Jump"))
        {
                downwardForce = Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y) * gravityJump;
                animator.SetTrigger("jump");
                
            
        }
        
        velocity.y = downwardForce;
        
       
        controller.Move(velocity * Time.deltaTime);


        if (isGrounded && moveValue == 0f)
        {
            animator.SetBool("idle", true);
        }
        else
        {
            animator.SetBool("idle", false);
        }

        if (actualStamina < 1f && !staminaBarIsUsed)
        {
            staminaRegenerationCooldown += Time.deltaTime;
            if (staminaRegenerationCooldown > 2f)
            {
                actualStamina += staminaRegenerationValue * Time.deltaTime;

            }
        }

       
        staminaBar.value = actualStamina;

        if (isGrounded)
        {
            if (moveValue != 0)
            {
                if (speedForce == 9f)
                {
                    animator.SetBool("walk", true);
                }
                else
                {
                    animator.SetBool("walk", false);
                }
                if (actualStamina > 0f && Input.GetKey(KeyCode.LeftShift))
                {
                    staminaBarIsUsed = true;
                    staminaRegenerationCooldown = 0f;
                    speedForce = 16f;
                    animator.SetBool("run", true);
                    animator.SetBool("walk", false);
                    
                    actualStamina -= runningCost * Time.deltaTime;
                       
                    
                }
                else
                {
                    staminaBarIsUsed = false;
                    animator.SetBool("run", false);
                    speedForce = 9f;

                }
            }
            else
            {
                staminaBarIsUsed = false;
                speedForce = 9f;
                animator.SetBool("run", false);
                animator.SetBool("walk", false);
            }
        }
        else
        {
            staminaBarIsUsed = false;
            speedForce = 9f;
            animator.SetBool("run", false);
            animator.SetBool("walk", false);
        }
        if (!isGrounded && velocity.y < -2f)
        {
            animator.SetTrigger("jumpLand");

        }

        if (direction.magnitude >= 0.1f)
        {
            float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y;
            float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime);
            transform.rotation = Quaternion.Euler(0f, angle, 0f);
            Vector3 moveDirection = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
            controller.Move(moveDirection.normalized * speedForce * Time.deltaTime);
        }

         
    }

    private void OnDrawGizmos()
    {
        Vector3 dir = transform.TransformDirection(Vector3.down) * raycastCheckDistance ;
        Debug.DrawRay(transform.position, dir, Color.red);
    }
}