using UnityEngine;

public class PlayerCarController : MonoBehaviour
{
    public Rigidbody player;
    public Transform frontAxle;
    public Transform rearAxle;
    public float speed;
    public AnimationCurve accelerationCurve;
    public float maxCarSpeed;
    public float currentSpeed;
    public float normalizedSpeed;
    public float turnSpeed;
    public AnimationCurve rearGripFactorCurve;
    public AnimationCurve frontGripFactorCurve;

    private Vector3 centerOfMass;
    private Vector3 currentSlip;

    private void Awake()
    {
        player = GetComponent<Rigidbody>();
    }

    public void FixedUpdate()
    {
        Drive();
        Grip();
        Turn();
    }

    public void Drive()
    {
        float rollingDirection = InputReader.accelerationFactor - InputReader.brakeFactor;
        float forwardForce = speed * GetAccelertion();
        player.AddForce(transform.forward * (forwardForce * rollingDirection * Time.deltaTime));
    }

    public float GetAccelertion()
    {
        currentSpeed = player.linearVelocity.magnitude;
        normalizedSpeed = currentSpeed / maxCarSpeed;
        return accelerationCurve.Evaluate(normalizedSpeed);
    }

    public void Grip()
    {
        Vector3 slipVector = transform.right * Vector3.Dot(transform.right, player.linearVelocity.normalized);
        float rearGripFactor = rearGripFactorCurve.Evaluate(normalizedSpeed);
        float frontGripFactor = frontGripFactorCurve.Evaluate(normalizedSpeed);

        player.AddForceAtPosition((slipVector * (Time.deltaTime * speed * rearGripFactor * -1)) / 2, rearAxle.position);
        player.AddForceAtPosition((slipVector * (Time.deltaTime * speed * frontGripFactor * -1)) / 2, frontAxle.position);
    }

    public void Turn()
    {
        transform.RotateAround(transform.position, transform.up, Time.deltaTime * InputReader.steerDirection * turnSpeed);
    }
}