using CommunityToolkit.Mvvm.ComponentModel;
using HC_APTBS.Services;
namespace HC_APTBS.ViewModels.Pages
{
///
/// ViewModel for the Bench navigation page.
///
/// Groups the bench-related child ViewModels owned by
/// together with page-specific façades
/// (temperature control, relay bank, pressure trace, interlock banner)
/// that only the Bench page consumes.
///
public sealed class BenchPageViewModel : ObservableObject
{
/// Root ViewModel — owns services, live readings, and global commands.
public MainViewModel Root { get; }
/// Manual bench controls (direction, RPM start/stop, oil pump, counter).
public BenchControlViewModel BenchControl => Root.BenchControl;
/// Real-time flowmeter charts (Q-Delivery, Q-Over).
public FlowmeterChartViewModel FlowmeterChart => Root.FlowmeterChart;
/// Encoder angle monitoring (PSG, INJ, Manual, Lock Angle).
public AngleDisplayViewModel AngleDisplay => Root.AngleDisplay;
/// Temperature PID setpoint + heater / cooler relay toggles.
public TemperatureControlViewModel TempControl { get; }
/// Auxiliary relay toggle bank (Electronic, Flasher, Pulse4Signal).
public RelayBankViewModel RelayBank { get; }
/// Real-time pressure traces (P1, P2).
public PressureTraceChartViewModel PressureTrace { get; } = new();
/// Soft safety interlock banner state (oil pump / RPM limit).
public InterlockBannerViewModel Interlock { get; }
/// Root view-model providing live bench readings and child VMs.
/// Bench service for setpoint and relay control.
/// Configuration service for safety limits and defaults.
public BenchPageViewModel(
MainViewModel root,
IBenchService benchService,
IConfigurationService configService)
{
Root = root;
TempControl = new TemperatureControlViewModel(benchService, configService);
RelayBank = new RelayBankViewModel(benchService);
Interlock = new InterlockBannerViewModel(configService);
}
///
/// Called from to feed the
/// page-scoped VMs (pressure trace, interlock banner) from the latest
/// bench readings. Keeping this here avoids adding page-specific logic
/// to the root ViewModel.
///
public void RefreshFromTick()
{
PressureTrace.AddSamples(Root.Pressure, Root.Pressure2);
Interlock.Update(Root.BenchRpm, BenchControl.IsOilPumpOn);
}
}
}