static void Main(string[] args)
        {
            var reportsExporter = new ReportsExporter();
            var importer        = new CSVImporter(File.ReadLines(FileName).Skip(1), new[] { reportsExporter });

            if (!importer.Import())
            {
                System.Console.WriteLine($"Struggling to import file(s) {FileName}");
                return;
            }

            var reports = reportsExporter.GetReportService();

            System.Console.WriteLine($"Top {NumberOfPopularItems} popular items.");

            foreach (var product in reports.TopMostPopularProducts(NumberOfPopularItems))
            {
                System.Console.WriteLine($"Item Code - {product.ItemCode} | Price - {product.Price:C} | Description - {product.Description}");
            }

            System.Console.WriteLine($"Average order value - {reports.AverageOrderValue()}");
            System.Console.WriteLine();
            System.Console.WriteLine($"Total value of discounts after {DiscountPercentage}% discount for item {DiscountedItem} - {reports.TotalValueOfDiscountsIssuedIfForProduct(DiscountedItem, DiscountPercentage)}");
            System.Console.WriteLine();
            System.Console.WriteLine($"Press any key to exit.");
            System.Console.ReadLine();
        }
        public void GivenACSVFeedWhenImportedThenTheCorrectReportsShouldBeGenerated()
        {
            var filePath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, FileName);

            var reportsExporter = new ReportsExporter();
            var importer        = new CSVImporter(File.ReadLines(filePath).Skip(1), new[] { reportsExporter });

            if (!importer.Import())
            {
                Assert.Fail("Failed to import and hence test failed.");
            }

            var reports = reportsExporter.GetReportService();

            var popularItems          = reports.TopMostPopularProducts(5);
            var averageOrderValue     = reports.AverageOrderValue();
            var totalValueOfDiscounts = reports.TotalValueOfDiscountsIssuedIfForProduct("MS55101", 20);

            Assert.AreEqual(19.09m, averageOrderValue);
            Assert.AreEqual(16126.35, totalValueOfDiscounts);

            Assert.AreEqual(5, popularItems.Length);

            Assert.AreEqual("PTYARN2", popularItems[0].ItemCode);
            Assert.AreEqual(0.15m, popularItems[0].Price);
            Assert.AreEqual("Textile Yarn - Recycled Flat Beige", popularItems[0].Description);

            Assert.AreEqual("GROAC40345", popularItems[1].ItemCode);
            Assert.AreEqual(3.79m, popularItems[1].Price);
            Assert.AreEqual("\"Groovi Guard 7\"\" x 7\"\"\"", popularItems[1].Description);

            Assert.AreEqual("GROAC40025", popularItems[2].ItemCode);
            Assert.AreEqual(4.29m, popularItems[2].Price);
            Assert.AreEqual("\"Clarity Groovi Parchment Paper 7\"\" x 7\"\"\"", popularItems[2].Description);

            Assert.AreEqual("GROTE40436", popularItems[3].ItemCode);
            Assert.AreEqual(14.99m, popularItems[3].Price);
            Assert.AreEqual("Groovi A4 Box Template - Christmas Cracker", popularItems[3].Description);

            Assert.AreEqual("GROFL40397", popularItems[4].ItemCode);
            Assert.AreEqual(13.99m, popularItems[4].Price);
            Assert.AreEqual("Alphabet Picture Frame A4 Groovi Plate by Jayne Nestorenko", popularItems[4].Description);
        }
        public void GivenACustomCSVFeedWhenImportedThenTheCorrectReportsShouldBeGenerated()
        {
            var datalines = new[]
            {
                "2469,29/05/2016,MS55999,Zig Memory System Wink of Stella Brush Glitter Marker Clear,4.99,1",
                "2469,29/05/2016,MS55000,Zig Memory System Wink of Stella Brush Glitter Marker White,4.99,1",
                "2469,29/05/2016,MS55102,Zig Memory System Wink of Stella Brush Glitter Marker Silver,4.99,1",
                "2469,29/05/2016,MS55101,Zig Memory System Wink of Stella Brush Glitter Marker Gold,4.99,100",
                "2470,29/05/2016,GROWO401311,Numbers Inset & Ovals & Tags Groovi Baby Plate,7.49,1",
                "2470,29/05/2016,GROBI4014501,Groovi Baby Plate A6 Large Bird & Branch,4.79,1",
                "2471,29/05/2016,COLLCEM12,Collall Photoglue,2.99,4",
                "2472,29/05/2016,GROPA40014,Groovi Plate Set Border Plates 1 & 2 ,14.99,1",
                "2472,29/05/2016,GROCH40015,Groovi Plate Border Set Bunting Wave-Alphabet & Christmas,14.99,1",
                "2473,29/05/2016,ACETHR001,Clear Heat Resistant Acetate,2.79,1",
                "2473,29/05/2016,SH131WH,3 Feather Spray - White,0.19,3",
                "2474,29/05/2016,GROAC40091,Clarity Groovi Tool Bag,1.99,1",
                "2474,29/05/2016,GROWO4027603,Happy Birthday  Groovi Plate A5 Square,7.49,1",
                "2477,30/05/2016,GROCN4028801,Groovi Baby Plate A6 Rocking Horse,4.79,1",
                "2477,30/05/2016,GROPE4028003,Geisha Groovi Plate A5 Square,7.49,1",
                "2477,30/05/2016,GROWO4027403,Best Wishes Groovi Plate A5 Square,7.49,50",
                "2478,30/05/2016,GROFL4021701,Groovi Baby Plate A6 Vases,4.79,1",
                "2478,30/05/2016,GROAC40025,\"Clarity Groovi Parchment Paper 7\"\" x 7\"\"\",4.29,1",
                "2478,30/05/2016,GROWO4010709,Groovi Plate Border Set Line Sentiments ,22.49,1",
                "2479,30/05/2016,GROLA4000703,Groovi Plate A5 Square Mountain Hills ,7.49,1",
                "2479,30/05/2016,GROPA4015609,Groovi Border Plate Half Tone,7.49,1",
                "2479,30/05/2016,GROBI4027701,Groovi Baby Plate A6 Small Bird & Feeder,4.79,1",
                "2480,30/05/2016,CR56329,MDF Wooden Letter T (13cm),1.79,1",
                "2480,30/05/2016,CR56314,MDF Wooden Letter E (13cm),1.79,1",
                "2480,30/05/2016,CR56318,MDF Wooden Letter I (13cm),1.79,1",
                "2480,30/05/2016,CR56321,MDF Wooden Letter L (13cm),1.79,2",
                "2480,30/05/2016,CR56324,MDF Wooden Letter O (13cm),1.79,1",
                "2481,30/05/2016,CEMDFCRACK,MDF Large Christmas Crackers by Creative Expressions,3.49,25",
                "2481,30/05/2016,CEMDFEGG,MDF Egg Stand by Creative Expressions,6.49,1",
                "2482,30/05/2016,SPECNSPACLE3,Spectrum Noir Sparkle Pens Clear Overlay,9.99,1",
                "2483,30/05/2016,AFRFLR001,Craft Consortium Always and Forever The Wedding Collection Resin Flowers - Ivory,2.79,1",
                "2483,30/05/2016,JL126,Brads-Baby Buttons,1.89,1",
                "2483,30/05/2016,CRRHINEROSEGO,Rose Gold Effect Resin Buttons (16mm),1.49,1",
                "2484,31/05/2016,GROFL40088,Groovi Plate Set Blooming Poppies,14.99,1",
                "2484,31/05/2016,GROMA40002,Groovi Plate Alphabet Mate,11.49,5",
                "2485,31/05/2016,SPECNSPACLE3,Spectrum Noir Sparkle Pens Clear Overlay,9.99,10",
                "2486,31/05/2016,GROFL40014,Groovi Plates Set Blooming Peonies/Sprig Pattern,14.99,1",
                "2486,31/05/2016,GROOB4031403,Oriental Fan & Bamboo Groovi Plate A5 Square,14.99,1",
                "2487,31/05/2016,CBC077,MDF Castle Keep Money Box,5.99,2",
                "2487,31/05/2016,BBBIH,Brusho Basics Book by Isobel Hall,5.99,1",
                "2488,01/06/2016,GROAC40091,Clarity Groovi Tool Bag,1.99,1",
                "2488,01/06/2016,GROOVIALBUM,Groovi Album,10.99,1",
                "2490,01/06/2016,GROPA4004609,Groovi Border Plates Set Lace Set 1 & 2,14.99,1",
                "2490,01/06/2016,GROPA4012609,Groovi Border Plates Set Lace Corners,7.49,1",
                "2490,01/06/2016,GROGG4020212,Groovi Piercing Grid Plate - Straight,11.49,1",
                "2490,01/06/2016,GROGG4020112,Groovi Piercing Grid Plate - Diagonal,11.49,1",
                "2490,01/06/2016,GROAC40203,Groovi Piercing Tools 0.95mm,4.79,1",
                "2490,01/06/2016,GROBI4004303,Groovi Plate Set Three Doves & Sprig ,14.99,1",
                "2491,02/06/2016,CEMDFTAG,MDF Tags by Creative Expressions,3.79,2",
                "2493,02/06/2016,GROFL40081,Groovi Plate Set Frilly Circles ,14.99,1"
            };

            var reportsExporter = new ReportsExporter();
            var importer        = new CSVImporter(datalines, new[] { reportsExporter });

            if (!importer.Import())
            {
                Assert.Fail("Failed to import and hence test failed.");
            }

            var reports = reportsExporter.GetReportService();

            var popularItems          = reports.TopMostPopularProducts(5);
            var averageOrderValue     = reports.AverageOrderValue();
            var totalValueOfDiscounts = reports.TotalValueOfDiscountsIssuedIfForProduct("MS55101", 20);

            Assert.AreEqual(69.57m, averageOrderValue);
            Assert.AreEqual(1361.07m, totalValueOfDiscounts);

            Assert.AreEqual(5, popularItems.Length);

            Assert.AreEqual("MS55101", popularItems[0].ItemCode);
            Assert.AreEqual(4.99m, popularItems[0].Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker Gold", popularItems[0].Description);

            Assert.AreEqual("GROWO4027403", popularItems[1].ItemCode);
            Assert.AreEqual(7.49m, popularItems[1].Price);
            Assert.AreEqual("Best Wishes Groovi Plate A5 Square", popularItems[1].Description);

            Assert.AreEqual("CEMDFCRACK", popularItems[2].ItemCode);
            Assert.AreEqual(3.49m, popularItems[2].Price);
            Assert.AreEqual("MDF Large Christmas Crackers by Creative Expressions", popularItems[2].Description);

            Assert.AreEqual("SPECNSPACLE3", popularItems[3].ItemCode);
            Assert.AreEqual(9.99m, popularItems[3].Price);
            Assert.AreEqual("Spectrum Noir Sparkle Pens Clear Overlay", popularItems[3].Description);

            Assert.AreEqual("GROMA40002", popularItems[4].ItemCode);
            Assert.AreEqual(11.49m, popularItems[4].Price);
            Assert.AreEqual("Groovi Plate Alphabet Mate", popularItems[4].Description);
        }