diff --git a/RhSolutions.AddIn/Services/SleevesCalculator.cs b/RhSolutions.AddIn/Services/SleevesCalculator.cs index 0c58f35..8e1524a 100644 --- a/RhSolutions.AddIn/Services/SleevesCalculator.cs +++ b/RhSolutions.AddIn/Services/SleevesCalculator.cs @@ -1,13 +1,64 @@ -namespace RhSolutions.Services; +using System.Text.RegularExpressions; + +namespace RhSolutions.Services; public class SleevesCalculator : ISleevesCaluculator { + private const string doublePattern = + @"((?i)равнопроходная|угольник 90|угольник 45|Т-образная|Комплект трубок(?i))(.+?(?\b16\b|\b20\b|\b25\b|\b32\b|\b40\b|\b50\b|\b63\b))+"; + private const string singlePattern = + @"((?i)муфта|тройник|переходник|угольник|штуцер|Г-образная|заглушка(?i))(.+?(?\b16\b|\b20\b|\b25\b|\b32\b|\b40\b|\b50\b|\b63\b))+"; + public Dictionary CalculateSleeves(Dictionary products) { - int counter = products.Where(kvp => kvp.Key.ProductLines.Contains("RAUTITAN")).Count(); - return new Dictionary() + Dictionary result = new() { - [new Product("11600011001")] = counter + ["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 + .Where(kvp => kvp.Value != 0) + .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); } }