using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float sprintSpeed = 10f;
    public float gravity = -9.81f;
    public float rotationSpeed = 10f;

    private CharacterController controller;
    private Vector3 velocity;
    private PlayerSkillTree PlayerSkills;

    private void Awake()
    {
        PlayerSkills = PlayerSkillTree.Instance;
    }

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            HandleDash();
        }

        if (Input.GetKeyDown(KeyCode.L))
        {
            if(PlayerSkills.TryUsePotion(PotionHandler.PotionType.HealthBig))
            {
                Debug.Log("Potion used!");
            }
            else
            {
                Debug.Log("Potion not available!");
            }
        }
    }

    void FixedUpdate()
    {
        HandleMovement();
        ApplyGravity();
    }

    void HandleMovement()
    {
        float moveX = Input.GetAxisRaw("Horizontal");
        float moveZ = Input.GetAxisRaw("Vertical");
        Vector3 move = new Vector3(moveX, 0, moveZ).normalized;

        if (move.magnitude >= 0.1f)
        {
            float currentSpeed = Input.GetKey(KeyCode.LeftShift) ? sprintSpeed : moveSpeed;
            
            Quaternion targetRotation = Quaternion.LookRotation(move);
            transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.fixedDeltaTime);

            controller.Move(move * currentSpeed * Time.fixedDeltaTime);
        }
    }

    void HandleDash()
    {
        if (PlayerSkills.IsSkillUnlocked(PlayerSkillTree.Skills.Dash))
        {
            // Implement dash logic
            Debug.Log("Dashing!");
        }
        else
        {
            Debug.Log("Dash skill is not unlocked.");
        }
    }

    void ApplyGravity()
    {
        if (IsGrounded() && velocity.y < 0) velocity.y = -2f;
        velocity.y += gravity * Time.fixedDeltaTime;
        controller.Move(velocity * Time.fixedDeltaTime);
    }

    bool IsGrounded()
    {
        float groundDistance = 0.2f;
        return Physics.Raycast(transform.position, Vector3.down, groundDistance);
    }

    public List<PlayerSkillTree.Skills> GetPlayerSkills()
    {
        return PlayerSkills.GetPlayerSkills();
    }
}