using UnityEngine;

public class CarroControl : MonoBehaviour
{
    [Header("Movimiento")]
    public float velocidad = 500f;
    public float velocidadReversa = 200f;
    public float fuerzaFrenado = 3000f;

    [Header("Wheel Colliders")]
    public WheelCollider colDelanteroIzq;
    public WheelCollider colDelanteroDer;
    public WheelCollider colTraseroIzq;
    public WheelCollider colTraseroDer;

    [Header("Visual Llantas")]
    public Transform llantaDelanteraIzq;
    public Transform llantaDelanteraDer;
    public Transform llantaTraseraIzq;
    public Transform llantaTraseraDer;

    [Header("Cámara")]
    public Transform camara;
    public Transform puntoCamara;

    [Header("Sonido Motor")]
    public AudioSource motorAudio;
    public float pitchMin = 0.7f;
    public float pitchMax = 2.0f;
    public float velocidadMaximaPitch = 50f;

    private Quaternion rotacionInicialCamara;
    private Vector3 offsetInicialCamara;

    private float tiempoDesdeMovimientoCarro = 0f;
    private float tiempoDesdeMovimientoCamara = 0f;

    public float tiempoResetCamaraCarro = 2f;
    public float tiempoResetCamaraMouse = 4f;

    private bool moviendoCamaraMouse = false;

    private float anguloActualCamara = 0f;
    private float velocidadRotacionCamara = 2f;

    private float inputVertical;
    private float inputHorizontal;
    private float rotacionCamara = 0f;

    private bool colisionando = false;
    private float tiempoFreno = 0.3f;
    private float contadorFreno = 0f;

    private Rigidbody rb;

    void Start()
    {
        rotacionInicialCamara = camara.rotation;
        offsetInicialCamara = camara.position - transform.position;

        rb = GetComponent<Rigidbody>();

        

        if (motorAudio != null)
            motorAudio.loop = true;
    }

    void Update()
    {
        inputVertical = Input.GetAxis("Vertical");
        inputHorizontal = Input.GetAxis("Horizontal");

        if (Mathf.Abs(inputHorizontal) > 0.01f || Mathf.Abs(inputVertical) > 0.01f)
            tiempoDesdeMovimientoCarro = 0f;
        else
            tiempoDesdeMovimientoCarro += Time.deltaTime;

        if (Input.GetKeyDown(KeyCode.E))
        {
            Vector3 euler = transform.eulerAngles;
            euler.z = 0f;
            transform.eulerAngles = euler;
        }

        ActualizarSonidoMotor();
    }

    void FixedUpdate()
    {
        float motor = 0f;
        float freno = 0f;

        if (contadorFreno > 0)
        {
            freno = fuerzaFrenado * 2;
            contadorFreno -= Time.fixedDeltaTime;
        }
        else
        {
            if (inputVertical > 0)
                motor = inputVertical * velocidad;
            else if (inputVertical < 0)
                motor = inputVertical * velocidadReversa;

            if (Input.GetKey(KeyCode.Space))
                freno = fuerzaFrenado;
        }

        colDelanteroIzq.motorTorque = motor;
        colDelanteroDer.motorTorque = motor;
        colTraseroIzq.motorTorque = motor;
        colTraseroDer.motorTorque = motor;

        colDelanteroIzq.brakeTorque = freno;
        colDelanteroDer.brakeTorque = freno;
        colTraseroIzq.brakeTorque = freno;
        colTraseroDer.brakeTorque = freno;

        colDelanteroIzq.steerAngle = inputHorizontal * 30f;
        colDelanteroDer.steerAngle = inputHorizontal * 30f;

        ActualizarLlantas(colDelanteroIzq, llantaDelanteraIzq);
        ActualizarLlantas(colDelanteroDer, llantaDelanteraDer);
        ActualizarLlantas(colTraseroIzq, llantaTraseraIzq);
        ActualizarLlantas(colTraseroDer, llantaTraseraDer);

        if (camara != null)
            ActualizarCamara();
    }

    void ActualizarLlantas(WheelCollider col, Transform llanta)
    {
        Vector3 pos;
        Quaternion rot;
        col.GetWorldPose(out pos, out rot);
        llanta.position = pos;
        llanta.rotation = rot;
    }

    void ActualizarCamara()
    {
        // Detectar dirección del carro
        Vector3 direccion = transform.forward;
        if (inputVertical < -0.1f)
            direccion = -transform.forward;

        // Ángulo en Y hacia donde apunta el carro
        float anguloObjetivo = Mathf.Atan2(direccion.x, direccion.z) * Mathf.Rad2Deg;

        // Interpolación suave del ángulo Y
        anguloActualCamara = Mathf.LerpAngle(anguloActualCamara, anguloObjetivo, Time.deltaTime * velocidadRotacionCamara);

        // Crear rotación con X = 20, Y interpolado
        Quaternion rotacionCamara = Quaternion.Euler(20f, anguloActualCamara, 0f);

        // Calcular offset rotado
        Vector3 offset = rotacionCamara * Vector3.back * offsetInicialCamara.magnitude;

        // Posición final de la cámara (incluye altura real del carro)
        Vector3 posicionFinal = puntoCamara.position + offset;

        camara.position = posicionFinal;
        camara.rotation = rotacionCamara; // ← Aquí forzamos que la cámara tenga X = 20
    }



    void ActualizarSonidoMotor()
    {
        if (motorAudio == null || rb == null)
            return;

        float velocidadActual = rb.velocity.magnitude;
        float t = Mathf.Clamp01(velocidadActual / velocidadMaximaPitch);
        float pitchActual = Mathf.Lerp(pitchMin, pitchMax, t);
        motorAudio.pitch = pitchActual;

        if (!motorAudio.isPlaying)
            motorAudio.Play();
    }

    void OnCollisionEnter(Collision collision)
    {
        colisionando = true;
        contadorFreno = tiempoFreno;
    }
}