using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    [Header("-----------GroundMovements-----------")]
    public float SpeedForce;
    public float JumpForce;
    [SerializeField] private LayerMask GroundLayer;
    [SerializeField] private Transform groundCheck;
    private bool isGrounded;
    private bool isFacingRight = true;
    private int facingDirection = 1;    // 1 = facing right  // -1= facing left

    [Header("-----------WallMovements-----------")]

    private bool isWallSliding;
    private bool isOnWall;
    [SerializeField] private Transform wallCheck;
    public float SlidingSpeed;
    [SerializeField] Vector2 wallJumpDirection;


    private float HorizontalInput;
    private Rigidbody2D rb;
    private Animator anim;
    private float coyoteTime;

    void Start()
    {
        anim = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
    }


    void Update()
    {
        HorizontalInput = Input.GetAxisRaw("Horizontal");

        CheckInput();
        wallSliding();
        run();
        Collisions();


        anim.SetBool("IsGrounded", isGrounded);

    }

    //_____________________________________________________________________________________________________________________________________
    private void Collisions()
    {
        isGrounded = Physics2D.OverlapBox(groundCheck.position, new Vector2(0.17f, 0.015f), 0, GroundLayer);
        isOnWall = Physics2D.OverlapBox(wallCheck.position, new Vector2(0.01f, 0.17f), 0, GroundLayer);
    }
    
    //_____________________________________________________________________________________________________________________________________
    private void CheckInput()
    {
        if (isGrounded)
        {
            coyoteTime = 0.16f;
        }
        else
        {
            coyoteTime -= Time.deltaTime;
        }

        //check if space is pressed
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();

        }

    }
    //_____________________________________________________________________________________________________________________________________
    private void Jump()
    {
        //NormalJump
        if (coyoteTime > 0f)
        {
            rb.velocity = new Vector2(rb.velocity.x, JumpForce);
            anim.SetTrigger("Jump");
        }

        //WallJump
        else if (isWallSliding)
        {
            rb.velocity = new Vector2(wallJumpDirection.x * -facingDirection, wallJumpDirection.y);

        }
    }


    //_____________________________________________________________________________________________________________________________________
   
    private void wallSliding()
    {


        if (isOnWall && !isGrounded && rb.velocity.y < 0f)
        {
            isWallSliding = true;

            if (HorizontalInput > 0.01f)
            {
                anim.SetBool("OnRightWall", true);
            }
            else if (HorizontalInput < -0.01f)
            {
                anim.SetBool("LeftWall", true);
            }
            rb.velocity = new Vector2(rb.velocity.x, Mathf.Clamp(rb.velocity.y, -SlidingSpeed, float.MaxValue));
        }

        else
        {
            isWallSliding = false;
            rb.velocity = new Vector2(HorizontalInput * SpeedForce, rb.velocity.y);
            anim.SetBool("OnRightWall", false);
            anim.SetBool("LeftWall", false);



        }

    }

    //_____________________________________________________________________________________________________________________________________
    private void run()
    {
        //these ifs orient the player where he is looking
        if (HorizontalInput > 0.01f && !isFacingRight)
        {
            flip();

            anim.SetBool("run1", true);
            anim.SetBool("run2", false);
        }
        else if (HorizontalInput < -0.01f && isFacingRight)
        {
            flip();
            anim.SetBool("run2", true);
            anim.SetBool("run1", false);

        }
        else if (HorizontalInput == 0f)
        {
            anim.SetBool("run2", false);
            anim.SetBool("run1", false);
        }

        rb.velocity = new Vector2(HorizontalInput * SpeedForce, rb.velocity.y);


    }
    
    //_____________________________________________________________________________________________________________________________________
    private void flip()
    {
        facingDirection *= -1;
        isFacingRight = !isFacingRight;
        transform.Rotate(0, 180, 0);
    }
    //_____________________________________________________________________________________________________________________________________



}