using AGXUnity;
using AGXUnity.IO.OpenPLX;
using UnityEngine;
using UnityEngine.InputSystem;

/// <summary>
/// This script is a ported version of the controller provided in the t03-bulldozer OpenPLX tutorial, using the InputActionMapper
/// </summary>
public class BulldozerManeuvering : MonoBehaviour
{
  // Expose scaling factors used when mapping InputActions to OpenPLX signals
  public float MotorVelocityAmplitude = 418f;
  public float ShovelLiftVelocityAmplitude = -0.2f;
  public float ShovelTiltVelocityAmplitude = -0.2f;
  public float RipperLiftVelocityAmplitude = 0.1f;
  public InputActionAsset ActionMapAsset;

  private OpenPLXSignals m_signals;
  InputActionMapper m_actionMapper;

  private void Start()
  {
    // Setup signal mapper
    m_signals = GetComponent<OpenPLXSignals>().GetInitialized();
    m_actionMapper = new InputActionMapper( ActionMapAsset, "Bulldozer" );

    // Create maps from InputActions to OpenPLX inputs
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.drive_train.motor.target_angular_velocity_input" ), "Drive", MotorVelocityAmplitude );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.LeftLiftPrismatic_motor.target_linear_velocity_input" ), "ShovelLift", ShovelLiftVelocityAmplitude );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.RightLiftPrismatic_motor.target_linear_velocity_input" ), "ShovelLift", ShovelLiftVelocityAmplitude );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.LeftTiltPrismatic_motor.target_linear_velocity_input" ), "ShovelTilt", ShovelTiltVelocityAmplitude );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.RightTiltPrismatic_motor.target_linear_velocity_input" ), "ShovelTilt", ShovelTiltVelocityAmplitude );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.LeftRipperLiftPrismatic_motor.target_linear_velocity_input" ), "RipperLift", RipperLiftVelocityAmplitude );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.RightRipperLiftPrismatic_motor.target_linear_velocity_input" ), "RipperLift", RipperLiftVelocityAmplitude );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.drive_train.left_brake.engagement_fraction_input" ), "BrakeLeft", 1 );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.drive_train.right_brake.engagement_fraction_input" ), "BrakeRight", 1 );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.drive_train.left_clutch.engagement_fraction_input" ), "BrakeLeft", -1, 1 );
    m_actionMapper.CreateMap( m_signals.FindInputTarget( "Bulldozer.Scene.bulldozer.drive_train.right_clutch.engagement_fraction_input" ), "BrakeRight", -1, 1 );
  }
}
