using System.Globalization;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HC_APTBS.Models;
using HC_APTBS.Services;
namespace HC_APTBS.ViewModels
{
///
/// ViewModel for the bench Temperature Control panel:
/// PID setpoint input and heater / deposit cooler / inlet cooler relay toggles.
///
public sealed partial class TemperatureControlViewModel : ObservableObject
{
private readonly IBenchService _bench;
private readonly IConfigurationService _config;
/// Operator-entered PID setpoint in °C (text to allow invariant parsing).
[ObservableProperty] private string _setpointText = "40";
/// Tolerance ±°C applied when the setpoint is committed.
[ObservableProperty] private string _toleranceText = "2";
/// True when the deposit heater relay is energised.
[ObservableProperty] private bool _isHeaterOn;
/// True when the deposit cooler relay is energised.
[ObservableProperty] private bool _isDepositCoolerOn;
/// True when the T-in (inlet) cooler relay is energised.
[ObservableProperty] private bool _isTinCoolerOn;
/// Bench service for PID setpoint and relay control.
/// Configuration service — seeds setpoint from .
public TemperatureControlViewModel(IBenchService benchService, IConfigurationService configService)
{
_bench = benchService;
_config = configService;
// Seed setpoint from global temperature band midpoint, tolerance from its half-width.
int min = _config.Settings.TempMin;
int max = _config.Settings.TempMax;
int mid = (min + max) / 2;
int tol = (max - min) / 2;
SetpointText = mid.ToString(CultureInfo.InvariantCulture);
ToleranceText = tol.ToString(CultureInfo.InvariantCulture);
}
partial void OnIsHeaterOnChanged(bool value)
=> _bench.SetRelay(RelayNames.DepositHeater, value);
partial void OnIsDepositCoolerOnChanged(bool value)
=> _bench.SetRelay(RelayNames.DepositCooler, value);
partial void OnIsTinCoolerOnChanged(bool value)
=> _bench.SetRelay(RelayNames.TinCooler, value);
/// Applies the PID setpoint entered by the operator.
[RelayCommand]
private void ApplySetpoint()
{
if (!double.TryParse(SetpointText, NumberStyles.Float, CultureInfo.InvariantCulture, out double sp))
return;
if (!double.TryParse(ToleranceText, NumberStyles.Float, CultureInfo.InvariantCulture, out double tol))
tol = 2;
_bench.SetTemperatureSetpoint(sp, tol);
}
}
}