public override async Task <Product> RequestProduct(String Url)
        {
            Product product = new Product();

            product.Url = Url;
            if (Url.ToLower().Contains("bhphotovideo.com"))
            {
                try
                {
                    char[]    charsToTrim = { ' ', '\n', '\t' };
                    IDocument productDoc  = await this.GetWeb(Url);

                    if (productDoc == null)
                    {
                        product.Valid = false;
                        return(product);
                    }
                    String name = productDoc.QuerySelector(".js-main-product-name") != null?productDoc.QuerySelector(".js-main-product-name").TextContent.
                                  Trim(charsToTrim).Replace("\n", " ").Replace("\t", "") : String.Empty;

                    product.Name = name;

                    String price = productDoc.QuerySelector("span.ypYouPay") != null?productDoc.QuerySelector("span.ypYouPay").TextContent.
                                   Trim(charsToTrim) : String.Empty;

                    product.Price = price;

                    var availabilityNode = productDoc.QuerySelectorAll("span").Where(t => t.HasAttribute("data-selenium") && (t.GetAttribute("data-selenium").
                                                                                                                              Equals("inStock") || t.GetAttribute("data-selenium").Equals("notStock"))).FirstOrDefault();
                    String availability = availabilityNode != null?availabilityNode.GetAttribute("data-selenium") : String.Empty;

                    product.Availability = availability.Equals("inStock")?"In-Stock":"Out-of-Stock";

                    product.Valid = true;
                }
                catch (Exception ex)
                {
                    LoggerCin logger = new LoggerCin("C:\\Development\\ProductStatusNotifier\\Test\\bin\\Debug");
                    logger.Error(ex.ToString());
                    product.Valid = false;
                }
            }
            return(product);
        }
        public override async Task <Product> RequestProduct(String Url)
        {
            Product product = new Product();

            product.Url = Url;
            if (Url.ToLower().Contains("sabrepc.com"))
            {
                try
                {
                    char[]    charsToTrim = { ' ', '\n', '\t' };
                    IDocument productDoc  = await this.GetWeb(Url);

                    if (productDoc == null)
                    {
                        product.Valid = false;
                        return(product);
                    }
                    String name = productDoc.QuerySelector("div.product-name") != null?productDoc.QuerySelector("div.product-name").FirstElementChild.TextContent.
                                  Trim(charsToTrim).Replace("\n", " ").Replace("\t", "").Trim() : String.Empty;

                    product.Name = name;

                    var    priceNode = productDoc.QuerySelector("div.product-d").Children.Where(x => x.ClassName.Contains("integral")).FirstOrDefault();
                    String price     = priceNode != null ? priceNode.TextContent : String.Empty;
                    product.Price = price;

                    var    availabilityNode = productDoc.QuerySelectorAll("span").Where(n => n.ParentElement.ClassName.ToLower().Equals("availability in-stock")).FirstOrDefault();
                    string availability     = availabilityNode != null ? availabilityNode.TextContent : String.Empty;
                    product.Availability = availability.Equals("Out Of Stock") ? "Out-of-Stock" : "In-Stock";

                    product.Valid = true;
                }
                catch (Exception ex)
                {
                    LoggerCin logger = new LoggerCin("C:\\Development\\ProductStatusNotifier\\Test\\bin\\Debug");
                    logger.Error(ex.ToString());
                    product.Valid = false;
                }
            }
            return(product);
        }
        public override async Task <Product> RequestProduct(String Url)
        {
            Product product = new Product();

            product.Url = Url;
            if (Url.ToLower().Contains("tigerdirect.com"))
            {
                try
                {
                    char[]    charsToTrim = { ' ', '\n', '\t' };
                    IDocument productDoc  = await this.GetWeb(Url);


                    String name = productDoc.QuerySelector("div.prodName") != null?productDoc.QuerySelector("div.prodName h1").TextContent.
                                  Trim(charsToTrim).Replace("\n", " ").Replace("\t", "") : String.Empty;

                    product.Name = name;

                    String price = productDoc.QuerySelector(".salePrice") != null?productDoc.QuerySelector("span.salePrice").TextContent.
                                   Trim(charsToTrim) : String.Empty;

                    product.Price = price;

                    String availability = productDoc.QuerySelectorAll(".prodMesg") != null?productDoc.QuerySelector(".prodMesg").TextContent.Trim(charsToTrim) : String.Empty;

                    product.Availability = availability.ToLower().Contains("in stock") ? "In-Stock" : "Out-of-Stock";

                    product.Valid = true;
                }
                catch (Exception ex)
                {
                    LoggerCin logger = new LoggerCin("C:\\Development\\ProductStatusNotifier\\Test\\bin\\Debug");
                    logger.Error(ex.ToString());
                    product.Valid = false;
                }
            }
            return(product);
        }
        static void Main(string[] args)
        {
            logger = new LoggerCin(AppDomain.CurrentDomain.BaseDirectory + "logs.log");
            try
            {
                scrapperData = new ConsoleScrapperData();
                ParserResult <Options> result = CommandLine.Parser.Default.ParseArguments <Options>(args);
                if (!result.Errors.Any())
                {
                    var options = result.Value;
                    if (!String.IsNullOrEmpty(options.JsonPath))
                    {
                        jsonFile = options.JsonPath;
                    }
                    else
                    {
                        jsonFile = AppDomain.CurrentDomain.BaseDirectory + "\\config.json";
                    }

                    if (!String.IsNullOrEmpty(options.IFTTTKey))
                    {
                        scrapperData.IFTTTWebhookKey = options.IFTTTKey;
                    }
                    if (!String.IsNullOrEmpty(options.IFTTTEvent))
                    {
                        scrapperData.IFTTTEventName = options.IFTTTEvent;
                    }
                    if (options.Interval >= 1)
                    {
                        scrapperData.MonitoringInterval = options.Interval * 60000;
                    }
                }

                if (File.Exists(jsonFile))
                {
                    scrapperData = JSONToConfiguration(jsonFile);
                }

                if (scrapperData.ProductsToCheck.Any())
                {
                    scrapperData.ProductsToCheck = scrapperData.ProductsToCheck.OrderByDescending(p => p.StoreName).ToList();
                }

                System.Console.WriteLine("Running scheduled product check every {0} minutes...", (int)scrapperData.MonitoringInterval / 60000);
                if (!String.IsNullOrEmpty(scrapperData.IFTTTEventName) && !String.IsNullOrEmpty(scrapperData.IFTTTWebhookKey))
                {
                    System.Console.WriteLine("IFTTT Webhook key and event name added. Notifications enabled!");
                }
                else
                {
                    System.Console.WriteLine("No IFTTT webhook key and event name. Notifications disabled!");
                }

                if (scrapperData.ProductsToCheck.Any())
                {
                    System.Console.WriteLine("Monitoring " + scrapperData.ProductsToCheck.Count() + " products from configuration.");
                }

                aTimer = new Timer
                {
                    Interval = scrapperData.MonitoringInterval
                };
                aTimer.Elapsed  += OnTimedEvent;
                aTimer.AutoReset = true;
                aTimer.Enabled   = true;
                ConsoleLoop().Wait();
            }
            catch (Exception ex)
            {
                if (logger != null)
                {
                    logger.Fatal(ex.ToString());
                }
                else
                {
                    LoggerCin logger = new LoggerCin(AppDomain.CurrentDomain.BaseDirectory + "Fatal.log");
                }
            }
        }