using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using SSPCTester.Devices.Interfaces;
using SSPCTester.Logic.Models;
using SSPCTester.UI.Services;
namespace SSPCTester.UI.ViewModels;
/// 保护功能页 VM。
public partial class ProtectViewModel : ObservableObject
{
private readonly IPowerSupply _power;
private readonly UiLogSink _log;
private TestSessionViewModel? _session;
public ObservableCollection Rows { get; } = new();
[ObservableProperty] private Project? _project;
public ProtectViewModel(IPowerSupply power, UiLogSink log)
{
_power = power;
_log = log;
}
public void SetProject(Project p)
{
Project = p;
ProtectTestPlan.EnsureRows(p);
SyncRowsFromProject();
}
public void AttachSession(TestSessionViewModel session)
{
if (_session != null)
_session.ProtectResultsChanged -= SyncRowsFromProject;
_session = session;
_session.ProtectResultsChanged += SyncRowsFromProject;
}
private void SyncRowsFromProject()
{
if (Project == null) return;
ProtectTestPlan.RefreshMeasuredValues(Project, overwriteExisting: false);
Rows.Clear();
foreach (var row in Project.ProtectResults) Rows.Add(row);
}
[RelayCommand]
private async Task MeasurePowerAsync(ProtectRow? row)
{
if (row == null || !row.CanMeasureFromPower) return;
try
{
var (volts, amps) = await _power.ReadAsync();
row.MeasuredValue = row.ProtectType switch
{
"过压" or "欠压" => $"{volts:F3} V",
_ => $"{amps:F3} A"
};
if (row.Status == TestStatus.Running)
row.Status = TestStatus.Untested;
_log.Add(UiLogLevel.Success, $"保护功能 {row.ProtectType} 实测值:{row.MeasuredValue}");
}
catch (Exception ex)
{
_log.Add(UiLogLevel.Error, $"读取电源失败:{ex.Message}");
}
}
}