// Copyright 2026 CBTC ATP Project Authors.
// Licensed under the Apache License, Version 2.0.

///|
fn main {
  let odometer = @types.OdometerBounds::new(1000.0, 0.2, false, false)
  let state_a = @types.TrainState::new(
    1000,
    odometer,
    20.0,
    0.0,
    @types.CabMode::from_int(2),
    1,
    false,
    false,
    false,
  )
  let state_b = @types.TrainState::new(
    1000,
    odometer,
    20.0,
    0.0,
    @types.CabMode::from_int(2),
    1,
    false,
    false,
    false,
  )
  let input = @runtime.AtpCycleInput::new(
    1000.0, 20.0, odometer, 1000, state_a, state_b,
  )
  let ssp = @line_profile.StaticSpeedProfile::new(
    [@types.PhysicalSpeedSegment::new(0.0, 20000.0, 40.0)],
    [@types.GradientSegment::new(0.0, 20000.0, 0.0)],
    [],
    [],
  )
  let ma = @line_profile.MaResolver::new(5000)
  ma.update_ma(
    @types.MovementAuthority::new(1, 0, 0.0, 12000.0, 0.0, 0.0, 40.0),
    0,
  )
  let engine = @runtime.AtpCycleEngine::new(
    @types.SystemConfig::default(),
    @types.TrainParams::default_high_speed(),
    0.5,
    1.0,
  )
  let decision = engine.evaluate(
    input,
    ssp,
    @line_profile.TsrManager::new(),
    ma,
    @types.RailCondition::from_int(1),
  )
  println(
    "action_code=" +
    decision.action.code().to_string() +
    ",state_severity=" +
    decision.trace.state.severity_level().to_string() +
    ",permitted_mps=" +
    decision.trace.permitted_speed.to_string() +
    ",eoa_margin_m=" +
    decision.trace.margin_to_eoa.to_string() +
    ",reason_code=" +
    decision.trace.reason.code().to_string(),
  )
}