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; } = []; }