using System; using System.Collections.Generic; using System.Linq; namespace Elwig.Helpers.Billing { public class GraphEntry { public const int MinX = 50; public const int MinXGeb = 73; public const int MaxX = 140; public int Id { get; set; } public BillingData.CurveMode Mode { get; set; } public bool Abgewertet { get; set; } public Graph DataGraph { get; set; } public Graph? GebundenGraph { get; set; } public double? GebundenFlatBonus { get { try { var val = GebundenGraph?.DataX.Zip(GebundenGraph.DataY) .Select(e => Math.Round(e.Second - DataGraph.GetPriceAtOe(e.First), Precision)) .Distinct() .Single(); return (val == 0) ? null : val; } catch { return null; } } set { if (value is not double v) return; var values = Enumerable.Range(MinXGeb, MaxX - MinXGeb + 1) .Select(i => Math.Round(DataGraph.GetPriceAtOe(i) + v, Precision)) .ToArray(); GebundenGraph = new Graph(values, Precision, MinXGeb, MaxX); } } public List Contracts { get; set; } public string ContractsStringSimple => Contracts.Count != 0 ? string.Join(", ", Contracts.Select(c => c.Listing)) : "-"; public string ContractsString => Contracts.Count != 0 ? string.Join("\n", Contracts.Select(c => c.FullName)) : "-"; private readonly int Precision; public GraphEntry(int id, int precision, BillingData.CurveMode mode) { Id = id; Precision = precision; Mode = mode; DataGraph = new Graph(precision, MinX, MaxX); ; Contracts = []; } public GraphEntry(int id, int precision, BillingData.CurveMode mode, Dictionary data, Dictionary? gebunden) : this(id, precision, mode) { DataGraph = new Graph(data, precision, MinX, MaxX); if (gebunden != null) GebundenGraph = new Graph(gebunden, precision, MinXGeb, MaxX); } public GraphEntry(int id, int precision, BillingData.Curve curve, List contracts) : this(id, precision, curve.Mode) { DataGraph = new Graph(curve.Normal, precision, MinX, MaxX); if (curve.Gebunden != null) GebundenGraph = new Graph(curve.Gebunden, precision, MinXGeb, MaxX); Contracts = contracts; } private GraphEntry(int id, int precision, BillingData.CurveMode mode, Graph dataGraph, Graph? gebundenGraph, List contracts) { Id = id; Precision = precision; Mode = mode; DataGraph = dataGraph; GebundenGraph = gebundenGraph; Contracts = contracts; } public void AddGebundenGraph() { GebundenGraph ??= new Graph(Precision, MinXGeb, MaxX); } public void RemoveGebundenGraph() { GebundenGraph = null; } public GraphEntry Copy(int id) { return new GraphEntry(id, Precision, Mode, (Graph)DataGraph.Clone(), (Graph?)GebundenGraph?.Clone(), []); } } }