using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; namespace Elwig.Helpers.Billing { public class PaymentBillingData : BillingData { protected readonly Dictionary Curves; protected readonly Dictionary PaymentData; protected readonly Dictionary QualityData; protected readonly IEnumerable Vaributes; public PaymentBillingData(JsonObject data, IEnumerable vaributes) : base(data) { if (vaributes.Any(e => e.Any(c => c < 'A' || c > 'Z'))) throw new ArgumentException("Invalid vaributes"); Vaributes = vaributes; Curves = GetCurves(); PaymentData = GetPaymentData(); QualityData = GetQualityData(); } public static PaymentBillingData FromJson(string json, IEnumerable vaributes) { return new(ParseJson(json), vaributes); } private Dictionary GetData(JsonNode data) { return GetSelection(data, Vaributes).ToDictionary(e => e.Key, e => LookupCurve(e.Value)); } protected Dictionary GetPaymentData() { return GetData(GetPaymentEntry()); } protected Dictionary GetQualityData() { Dictionary dict = []; var q = GetQualityEntry(); if (q == null) return dict; foreach (var (qualid, data) in q) { foreach (var (idx, d) in GetData(data ?? throw new InvalidOperationException())) { dict[$"{qualid}/{idx}"] = d; } } return dict; } public decimal CalculatePrice(string sortid, string? attrid, string qualid, bool gebunden, double oe, double kmw) { var curve = GetQualityCurve(qualid, sortid, attrid) ?? GetCurve(sortid, attrid); return GetCurveValueAt((gebunden ? curve.Gebunden : null) ?? curve.Normal, curve.Mode == CurveMode.Oe ? oe : kmw); } private Curve LookupCurve(JsonValue val) { if (val.TryGetValue(out string? curve)) { var curveId = int.Parse(curve.Split(":")[1]); return Curves[curveId]; } else if (val.TryGetValue(out decimal value)) { return new(CurveMode.Oe, new() { { 73, value } }, null); } throw new InvalidOperationException(); } protected Curve GetCurve(string sortid, string? attrid) { return PaymentData[$"{sortid}{attrid}"]; } protected Curve? GetQualityCurve(string qualid, string sortid, string? attrid) { return QualityData.TryGetValue($"{qualid}/{sortid}{attrid}", out var curve) ? curve : null; } } }