using UnityEngine;

public class PlayerSlide : MonoBehaviour
{
    public bool IsSliding { get { return isSliding; } }

    // Slide-related variables
    private bool isSliding = false;
    private PlayerMovement playerMovement;
    [SerializeField] private float slideSpeed = 3f;
    [SerializeField] private float slideDuration = 0.3f;
    [SerializeField] private float slideGravityScale = 3f;
    [SerializeField] private float normalGravityScale = 2f;
    [SerializeField] private PhysicsMaterial2D slidePhysicsMaterial;  // Assign in Inspector
    [SerializeField] private PhysicsMaterial2D normalPhysicsMaterial; // Assign in Inspector

    [SerializeField] private Rigidbody2D rb;           // Assign in Inspector
    [SerializeField] private BoxCollider2D playerCollider; // Assign in Inspector
    [SerializeField] private Transform groundCheck;      // Assign in Inspector
    [SerializeField] private LayerMask groundLayer;        // Assign in Inspector

    void start()
    {
        playerMovement = GetComponent<PlayerMovement>();
    }

    void Update()
    {
        // Check for slide input using the S key (or add alternate bindings in Input Manager)
        if (Input.GetKeyDown(KeyCode.S) && IsGrounded())
        {
            StartSlide();
        }
    }

    private bool IsGrounded()
    {
        return Physics2D.OverlapCircle(groundCheck.position, 0.3f, groundLayer);
    }

    private void StartSlide()
    {
        if (!isSliding && IsGrounded())
        {
            isSliding = true;
            // Disable the PlayerMovement script
            if (playerMovement != null)
                playerMovement.enabled = false;
            
            Debug.Log("Slide initiated! Normal Gravity: " + rb.gravityScale);

            // Boost player speed forward (using the current facing direction)
            rb.linearVelocity = new Vector2(transform.localScale.x * slideSpeed, rb.linearVelocity.y);

            // Set slide physics material to reduce friction
            rb.sharedMaterial = slidePhysicsMaterial;

            // Increase gravity during slide so the player stays close to the ground
            rb.gravityScale = slideGravityScale;
            Debug.Log("Slide Gravity set to: " + rb.gravityScale);

            // Stop the slide after a duration
            Invoke(nameof(StopSlide), slideDuration);
        }
    }

    private void StopSlide()
    {
        isSliding = false;
        // Reset physics material to normal friction
        rb.sharedMaterial = normalPhysicsMaterial;
        // Toggle collider to refresh it
        playerCollider.enabled = false;
        playerCollider.enabled = true;
        // Reset gravity to normal
        rb.gravityScale = normalGravityScale;
        rb.WakeUp();
        // Re-enable the PlayerMovement script
        if (playerMovement != null)
            playerMovement.enabled = true;
        Debug.Log("Slide ended. Gravity reset to: " + rb.gravityScale);
    }
}