aboutsummaryrefslogtreecommitdiff
path: root/Source/Assistant/SkuAssist.cs
blob: a0195ba2405c9552e427d9ea4bef20ac297d0dcc (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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using AngleSharp.Dom;
using ExcelDna.Integration;
using Newtonsoft.Json;
using System;
using System.Globalization;
using System.Linq;
using System.Runtime.Caching;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Rehau.Sku.Assist
{
    public enum ProductField
    {
        Name,
        Id,
        Price
    }

    static class SkuAssist
    {
        public static async Task<IProduct> GetProduct(string request)
        {
            Uri uri = request.ConvertToUri();

            Task<string> contentTask = Task.Run(() => HttpClientUtil.GetContentByUriAsync(uri));
            Task<IDocument> documentTask = await contentTask.ContinueWith(content => HttpClientUtil.ContentToDocAsync(content));

            return GetProduct(documentTask.Result);
        }

        public static IProduct GetProduct(IDocument d)
        {
            string script = d.Scripts
                   .Where(s => s.InnerHtml.Contains("dataLayer"))
                   .First()
                   .InnerHtml;

            string json = script
                .Substring(script.IndexOf("push(") + 5)
                .TrimEnd(new[] { ')', ';', '\n', ' ' });

            if (!json.Contains("impressions"))
                return null;

            StoreResponce storeResponse = JsonConvert.DeserializeObject<StoreResponce>(json);
            IProduct product = storeResponse
                .Ecommerce
                .Impressions
                .Where(p => Regex.IsMatch(p.Id, @"\d{11}", RegexOptions.None))
                .FirstOrDefault();

            return product;
        }

        public static object GetProduct(string request, ProductField field)
        {
            IProduct product;

            if (MemoryCache.Default.Contains(request))
            {
                product = MemoryCache.Default[request] as IProduct;
            }

            else
            {
                object result = ExcelAsyncUtil.Run("RauName", new[] { request },
                    delegate
                    {
                        Task<IProduct> p = Task.Run(() => GetProduct(request));
                        return p.Result;
                    });

                if (result == null)
                    return "Не найдено :(";

                if (result.Equals(ExcelError.ExcelErrorNA))
                    return "Загрузка...";

                product = result as IProduct;
                MemoryCache.Default.Add(request, product, DateTime.Now.AddMinutes(10));
            }

            switch (field)
            {
                case ProductField.Name:
                    return product.Name;
                case ProductField.Id:
                    return product.Id;
                case ProductField.Price:
                    return double.Parse((string)product.Price, CultureInfo.InvariantCulture);
                default:
                    return ExcelError.ExcelErrorValue;
            }
        }
    }
}