using System;

namespace MultiWheelC.Control.Abstractions
{
    /// <summary>
    /// 表示横向控制器生成的车体中心目标曲率命令。
    /// </summary>
    public readonly struct LateralControlCommand
    {
        /// <summary>
        /// 创建统一使用SI单位和左转为正约定的横向控制命令。
        /// </summary>
        public LateralControlCommand(
            double targetCurvaturePerMeter)
        {
            EnsureFinite(
                targetCurvaturePerMeter,
                nameof(targetCurvaturePerMeter));

            TargetCurvaturePerMeter =
                targetCurvaturePerMeter;
        }

        /// <summary>
        /// 获取车体中心目标轨迹曲率，单位为1/m，左转为正、右转为负。
        /// </summary>
        public double TargetCurvaturePerMeter { get; }

        /// <summary>
        /// 创建保持直线行驶的零曲率命令。
        /// </summary>
        public static LateralControlCommand Straight =>
            new LateralControlCommand(0.0);

        /// <summary>
        /// 检查横向曲率命令是否为有限值。
        /// </summary>
        private static void EnsureFinite(
            double value,
            string parameterName)
        {
            if (double.IsNaN(value) ||
                double.IsInfinity(value))
            {
                throw new ArgumentOutOfRangeException(
                    parameterName,
                    "横向控制目标曲率必须是有限值。");
            }
        }
    }
}
