using System.Text.RegularExpressions; namespace RhSolutions.Services; public class SleevesCalculator : IFittingsCalculator { private const string doublePattern = @"((?i)равнопроходная|угольник\s+90|угольник\s+45|Т-образная|Комплект\s+трубок(?i))(.+?\b(?16|20|25|32|40|50|63)\b)+"; private const string singlePattern = @"((?i)муфта|тройник|переходник|угольник|штуцер|Г-образная|заглушка(?i))(.+?\b(?16|20|25|32|40|50|63)\b)+"; public Dictionary Calculate(Dictionary products) { Dictionary result = new() { ["16"] = 0, ["20"] = 0, ["25"] = 0, ["32"] = 0, ["40"] = 0, ["50"] = 0, ["63"] = 0, ["16PX"] = 0, ["20PX"] = 0, ["25PX"] = 0, ["32PX"] = 0, ["40PX"] = 0 }; var rautitanProducts = products.Where(kvp => kvp.Key.ProductLines.Contains("RAUTITAN")); foreach (var kvp in rautitanProducts) { var doubleCollection = Regex.Matches(kvp.Key.Name, doublePattern); if (doubleCollection.Count != 0) { CaptureCollection collection = doubleCollection[0].Groups["Sleeve"].Captures; foreach (Capture sleeve in collection) { if (kvp.Key.Name.Contains("PX")) { result[$"{sleeve.Value}PX"] += kvp.Value * 2; } else { result[sleeve.Value] += kvp.Value * 2; } } continue; } var singleCollection = Regex.Matches(kvp.Key.Name, singlePattern); if (singleCollection.Count != 0) { CaptureCollection collection = singleCollection[0].Groups["Sleeve"].Captures; foreach (Capture sleeve in collection) { if (kvp.Key.Name.Contains("PX")) { result[$"{sleeve.Value}PX"] += kvp.Value; } else { result[sleeve.Value] += kvp.Value; } } } } return result .ToDictionary(kvp => kvp.Key switch { "16" => new Product("11080011001"), "20" => new Product("11080021001"), "25" => new Product("11080031001"), "32" => new Product("11080041001"), "40" => new Product("11080051001"), "50" => new Product("11397713002"), "63" => new Product("11397813002"), "16PX" => new Product("11600011001"), "20PX" => new Product("11600021001"), "25PX" => new Product("11600031001"), "32PX" => new Product("11600041001"), "40PX" => new Product("11600051001"), _ => throw new Exception($"Неизвестный диаметр {kvp.Key}") }, kvp => kvp.Value); } }