///|
pub(all) struct DistantSignalLinkage {
  distant_signal_id : @topology.SignalId
  home_signal_id : @topology.SignalId
} derive(Debug)

///|
pub fn update_distant_signal_linkage(
  station : @topology.Station,
  linkage : DistantSignalLinkage,
) -> Result[Unit, String] {
  match station.graph.get_signal(linkage.home_signal_id) {
    None => Err("Home signal not found")
    Some(home_sig) => {
      let distant_aspect = match home_sig.current_aspect {
        Red => @topology.SignalAspect::Yellow
        Yellow => @topology.SignalAspect::Green
        Green => @topology.SignalAspect::Green
        DoubleYellow => @topology.SignalAspect::YellowGreen
        _ => @topology.SignalAspect::Yellow
      }
      station.set_signal_aspect(linkage.distant_signal_id, distant_aspect)
    }
  }
}

///|
pub fn determine_signal_aspect_for_route(
  route_type : RouteType,
  is_diverging : Bool,
  exit_signal_aspect : @topology.SignalAspect,
) -> @topology.SignalAspect {
  match route_type {
    ShuntingRoute => @topology.SignalAspect::White
    ReceivingRoute =>
      if is_diverging {
        @topology.SignalAspect::DoubleYellow
      } else {
        match exit_signal_aspect {
          Red => @topology.SignalAspect::Yellow
          _ => @topology.SignalAspect::Green
        }
      }
    DepartureRoute => @topology.SignalAspect::Green
    PassingRoute =>
      if is_diverging {
        @topology.SignalAspect::DoubleYellow
      } else {
        @topology.SignalAspect::Green
      }
  }
}