using MultiWheelC.TrajectoryPlanning.Mapping;

namespace MultiWheelC.TrajectoryPlanning.CoarsePath;

/// <summary>
/// 已建规划地图上的一次 Hybrid A* 请求。
/// 本对象只接受不可变 <see cref="PlanningGridMap"/> 快照，不包含地图构建器、传感器、UI 或调试对象。
/// </summary>
public sealed class PlanningRequest
{
    /// <summary>创建空规划请求。调用规划器前必须提供地图、起点、终点、车辆和配置。</summary>
    public PlanningRequest()
    {
        StartVehicleCurvature = 0d;
        GoalDirection = GoalDirectionConstraint.Any;
    }

    /// <summary>本次搜索唯一允许查询的不可变规划地图快照；位置查询单位为 m。</summary>
    public PlanningGridMap Map { get; set; }

    /// <summary>车辆几何中心的起始位姿；位置单位 m，航向单位 rad。</summary>
    public Pose2D Start { get; set; }

    /// <summary>车辆几何中心的目标位姿；位置单位 m，航向单位 rad。</summary>
    public Pose2D Goal { get; set; }

    /// <summary>车辆几何、余量和曲率限制；尺寸单位 m，曲率单位 1/m。</summary>
    public VehicleParameters Vehicle { get; set; }

    /// <summary>搜索步长、离散、终点容差、代价和资源上限配置。</summary>
    public HybridAStarConfiguration Configuration { get; set; }

    /// <summary>车辆起步时的转向曲率，单位 1/m；默认值为 0。</summary>
    public double StartVehicleCurvature { get; set; }

    /// <summary>起步方向约束；null 表示可从前进或倒车开始。</summary>
    public TravelDirection? StartDirection { get; set; }

    /// <summary>目标进入方向约束；默认值为 <see cref="GoalDirectionConstraint.Any"/>。</summary>
    public GoalDirectionConstraint GoalDirection { get; set; }
}
