///|
pub(all) struct TraverseMotionContract {
  contract_id : String
  site_id : String
  selected_route_id : String
  physics_core_package : String
  motion_owner_package : String
  preview_kind : String
  gait_asset_status : String
  simulation_status : String
  status : String
  next_action : String
} derive(Debug, Eq, ToJson, FromJson)

///|
fn simulation_status_for_decision(decision : String) -> String {
  if decision == "allow" {
    "simulation-preview-ready"
  } else if decision == "review" {
    "simulation-preview-needs-review"
  } else {
    "simulation-preview-blocked"
  }
}

///|
fn motion_contract_status(decision : String) -> String {
  if decision == "allow" {
    "suite-adapter-ready"
  } else {
    "mission-gated"
  }
}

///|
fn motion_contract_next_action(view : TrustedSquareViewModel) -> String {
  if view.scorecard.decision == "allow" {
    "add a suite adapter that consumes this route and supplies robot-specific gait assets"
  } else {
    "clear terrain, illumination, energy, and review blockers before binding robot gait assets"
  }
}

///|
pub fn traverse_motion_contract(
  view : TrustedSquareViewModel,
) -> TraverseMotionContract {
  {
    contract_id: "ui/first-trusted-square/traverse-motion-contract-v1",
    site_id: view.site_id,
    selected_route_id: view.selected_route_id,
    physics_core_package: "src/moonphys",
    motion_owner_package: "future-suite-adapter",
    preview_kind: "standalone-route-motion-contract",
    gait_asset_status: "not-in-standalone-model",
    simulation_status: simulation_status_for_decision(view.scorecard.decision),
    status: motion_contract_status(view.scorecard.decision),
    next_action: motion_contract_next_action(view),
  }
}

///|
pub fn first_trusted_square_motion_contract() -> TraverseMotionContract {
  traverse_motion_contract(first_trusted_square_view_model())
}

///|
pub fn first_trusted_square_motion_contract_json() -> Json {
  first_trusted_square_motion_contract().to_json()
}