using System.Text.RegularExpressions; namespace RhSolutions.Services; public class SleevesCalculator : ISleevesCalculator { 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 CalculateSleeves(Dictionary products) { Dictionary result = new() { ["16"] = 0, ["20"] = 0, ["25"] = 0, ["32"] = 0, ["40"] = 0, ["50"] = 0, ["63"] = 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) { 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) { result[sleeve.Value] += kvp.Value; } } } return result .ToDictionary(kvp => kvp.Key switch { "16" => new Product("11600011001"), "20" => new Product("11600021001"), "25" => new Product("11600031001"), "32" => new Product("11600041001"), "40" => new Product("11600051001"), "50" => new Product("11397711002"), "63" => new Product("11397811002"), _ => throw new Exception($"Неизвестный диаметр {kvp.Key}") }, kvp => kvp.Value); } }