summaryrefslogtreecommitdiff
path: root/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs
blob: b8845f5d5cb96c625d462f39780f1b9c8ada7f86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System.Text.RegularExpressions;

namespace RhSolutions.Parsers.Pipes;

public abstract class DrinkingWaterHeatingPipe : IProductParser
{
	protected static readonly Regex _diameter =
		new(@"(?<!^|\d)(?<Diameter>16|20|25|32|40|50|63|14|15|26)(?!\d)");
	protected static readonly Regex _type =
		new(@"([\b\W])(?<Type>бухт|отр|штанг)([\b\w\.\s])");
	protected virtual string _title { get; } = string.Empty;

	protected virtual Dictionary<int, string> _diameterNames { get; } = new()
	{
		[16] = "16x2,2",
		[20] = "20x2,8",
		[25] = "25x3,5",
		[32] = "32x4,4",
		[40] = "40x5,5",
		[50] = "50x6,9",
		[63] = "63x8,6"
	};

	protected virtual Dictionary<string, string> _makeUp { get; } = new()
	{
		["бухт"] = "бухта",
		["штанг"] = "прям.отрезки",
		["отр"] = "прям.отрезки"
	};

	public virtual bool TryParse(string input, out string output)
	{
		output = string.Empty;
		var diameterMatch = _diameter.Match(input);
		if (!diameterMatch.Success)
		{
			return false;
		}
		var diameter = int.Parse(NormalizeDiameter(diameterMatch.Groups["Diameter"].Value));
		var typeMatch = _type.Match(input);
		if (typeMatch.Success)
		{
			var type = typeMatch.Groups["Type"].Value;
			output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp[type]}";
		}
		else if (diameter < 32)
		{
			output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp["бухт"]}";
		}
		else
		{
			output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp["отр"]}";
		}
		return true;
	}

	protected string NormalizeDiameter(string diameter)
	{
		return diameter switch
		{
			"14" => "16",
			"26" => "25",
			_ => diameter
		};
	}
}