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

public class InputManager : MonoBehaviour
{
    internal enum Driver
    {
        AI,
        Keyboard
    }

    [Range(0, 10)] public int aiDistanceOffset;
    [Range(0, 5)] public float aiSteerForce;

    [SerializeField] private Driver driverController;

    public float vertical;
    public float horizontal;
    public bool handbrake;
    public bool boosting;

    public TrackWayPoints waypoints;
    public Transform currentWaypoint;
    public List<Transform> nodes = new List<Transform>();

    private void Awake()
    {
        waypoints = GameObject.FindWithTag("path").GetComponent<TrackWayPoints>();
        nodes = waypoints.nodes;
    }

    private void Update()
    {
        switch (driverController)
        {
            case Driver.AI:
                AIDriver();
                break;
            case Driver.Keyboard:
                KeyboardDrive();
                break;
        }
    }

    private void AIDriver()
    {
        vertical = 0.3f;
        AISteer();
    }

    private void KeyboardDrive()
    {
        vertical = Input.GetAxis("Vertical");
        horizontal = Input.GetAxis("Horizontal");
        handbrake = Input.GetButton("Jump");
        boosting = Input.GetKey(KeyCode.LeftShift);

        calculateDistanceOfWaypoints();
    }

    private void calculateDistanceOfWaypoints()
    {
        Vector3 position = transform.position;
        float distance = Mathf.Infinity;

        for (int i = 0; i < nodes.Count; i++)
        {
            Vector3 difference = nodes[i].position - position;
            float currentDistance = difference.magnitude;
            if (currentDistance < distance)
            {
                currentWaypoint = nodes[i];
                distance = currentDistance;
            }
        }
    }

    private void AISteer()
    {
        if (currentWaypoint != null)
        {
            Vector3 relative = currentWaypoint.position - transform.position;
            relative.y = 0f; // Mantén la misma altura

            Quaternion rotationToWaypoint = Quaternion.LookRotation(relative);
            Quaternion localRotation = Quaternion.Inverse(transform.rotation) * rotationToWaypoint;

            // Obtén el ángulo de rotación en el eje Y
            float angle = localRotation.eulerAngles.y;

            // Ajusta la dirección de giro en función del ángulo
            horizontal = Mathf.Clamp(angle / 180f, -1f, 1f) * aiSteerForce;
        }
    }

    private void OnDrawGizmos()
    {
        if (currentWaypoint != null)
        {
            Gizmos.DrawWireSphere(currentWaypoint.position, 3);
        }
    }
}