using MeterVault.Core.Domain;
namespace MeterVault.Core.Normalization;
///
/// The immutable, infrastructure-free view of a meter that the normalization engine needs.
/// Infrastructure projects a (+ optional ) into this.
///
public sealed record MeterConfig
{
public required int MeterId { get; init; }
public required MeterMode Mode { get; init; }
public required string Unit { get; init; }
/// Register baseline for a newly installed meter (SDD §7.1). Default 0.
public double InitialBaseline { get; init; }
/// Tank/runtime configuration for consumable_balance and runtime_counter meters.
public TankConfig? Tank { get; init; }
/// Expression + referenced meters for virtual meters.
public VirtualSpec? Virtual { get; init; }
}
/// Consumable/runtime parameters (SDD §5.3 tank).
public sealed record TankConfig
{
public double Capacity { get; init; }
public TankRateMode RateMode { get; init; } = TankRateMode.Empirical;
/// Litres per runtime-hour when is Fixed.
public double? FixedRate { get; init; }
/// Physical-level (cm) → volume curve. Present when dipstick readings are recorded.
public CalibrationCurve? Calibration { get; init; }
}
/// A virtual meter's expression over other meters' series (SDD §7.4).
public sealed record VirtualSpec
{
public required string Expression { get; init; }
public IReadOnlyList ReferencedMeterIds { get; init; } = [];
}