using CommunityToolkit.Mvvm.ComponentModel;
using HC_APTBS.Models;
using HC_APTBS.Services;
namespace HC_APTBS.ViewModels
{
///
/// ViewModel for the three manual pump control sliders: FBKW (advance), ME (quantity),
/// and PreIn (pre-injection quantity). Each slider change calls
/// to update the CAN bus.
///
public sealed partial class PumpControlViewModel : ObservableObject
{
private readonly IBenchService _bench;
///
/// When true, suppress forwarding slider changes to the bench service.
/// Used during programmatic updates to avoid re-entrant CAN sends.
///
private bool _suppressSend;
// ── FBKW (Advance Control) ───────────────────────────────────────────────
/// Current FBKW slider value.
[ObservableProperty] private double _fbkwValue;
/// FBKW slider minimum.
[ObservableProperty] private double _fbkwMin;
/// FBKW slider maximum.
[ObservableProperty] private double _fbkwMax = 100;
/// FBKW slider tick frequency / step.
[ObservableProperty] private double _fbkwStep = 10;
// ── ME (Quantity Control) ─────────────────────────────────────────────────
/// Current ME slider value.
[ObservableProperty] private double _meValue;
/// ME slider minimum.
[ObservableProperty] private double _meMin;
/// ME slider maximum.
[ObservableProperty] private double _meMax = 100;
/// ME slider tick frequency / step.
[ObservableProperty] private double _meStep = 10;
// ── PreIn (Pre-injection Quantity) ────────────────────────────────────────
/// Current PreIn slider value.
[ObservableProperty] private double _preInValue;
/// PreIn slider minimum.
[ObservableProperty] private double _preInMin;
/// PreIn slider maximum.
[ObservableProperty] private double _preInMax = 100;
/// PreIn slider tick frequency / step.
[ObservableProperty] private double _preInStep = 10;
// ── Visibility / enablement ───────────────────────────────────────────────
/// True when the current pump supports pre-injection.
[ObservableProperty] private bool _isPreInVisible;
/// True when a pump is selected and CAN is connected.
[ObservableProperty] private bool _isEnabled;
// ── Constructor ───────────────────────────────────────────────────────────
/// Creates the ViewModel wired to the bench service for CAN output.
public PumpControlViewModel(IBenchService bench)
{
_bench = bench;
}
// ── Property-changed callbacks → CAN send ─────────────────────────────────
partial void OnFbkwValueChanged(double value)
{
if (!_suppressSend)
_bench.SetPumpControlValue(PumpParameterNames.Fbkw, value);
}
partial void OnMeValueChanged(double value)
{
if (!_suppressSend)
_bench.SetPumpControlValue(PumpParameterNames.Me, value);
}
partial void OnPreInValueChanged(double value)
{
if (!_suppressSend)
_bench.SetPumpControlValue(PumpParameterNames.PreIn, value);
}
// ── Public API ────────────────────────────────────────────────────────────
///
/// Called when the test executor sets a pump parameter value.
/// Auto-expands slider min/max if the value exceeds the current range.
/// Must be called on the UI thread.
///
public void SetValueFromTest(string paramName, double value)
{
_suppressSend = true;
try
{
switch (paramName)
{
case PumpParameterNames.Me:
if (value > MeMax) MeMax = value;
else if (value < MeMin) MeMin = value;
MeValue = value;
break;
case PumpParameterNames.Fbkw:
if (value > FbkwMax) FbkwMax = value;
else if (value < FbkwMin) FbkwMin = value;
FbkwValue = value;
break;
case PumpParameterNames.PreIn:
if (value > PreInMax) PreInMax = value;
else if (value < PreInMin) PreInMin = value;
PreInValue = value;
break;
}
}
finally
{
_suppressSend = false;
}
}
/// Resets all slider values to zero and restores default min/max/step.
public void Reset()
{
_suppressSend = true;
try
{
FbkwValue = 0; FbkwMin = 0; FbkwMax = 100; FbkwStep = 10;
MeValue = 0; MeMin = 0; MeMax = 100; MeStep = 10;
PreInValue = 0; PreInMin = 0; PreInMax = 100; PreInStep = 10;
}
finally
{
_suppressSend = false;
}
}
}
}