private void Start()
        {
            System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

            ShopUtils.CreateFiles();

            productList  = ShopUtils.DeserializeProducts(ShopUtils.GetFilePath("Products.json"));
            shoppingCart = ShopUtils.DeserializeProducts(ShopUtils.GetFilePath("Cart.json"));
            couponList   = Coupon.DeserializeCoupons();

            #region Custom brushes
            // declare a brushconverter to convert a hex color code string to a Brush color
            BrushConverter brushConverter  = new System.Windows.Media.BrushConverter();
            Brush          backgroundBrush = (Brush)brushConverter.ConvertFromString("#2F3136");
            Brush          listBoxBrush    = (Brush)brushConverter.ConvertFromString("#36393F");
            Brush          textBoxBrush    = (Brush)brushConverter.ConvertFromString("#40444B");
            Brush          expanderBrush   = (Brush)brushConverter.ConvertFromString("#202225");
            #endregion

            // Set Window properties
            Title  = "Butiken";
            Width  = 900;
            Height = 600;
            WindowStartupLocation = WindowStartupLocation.CenterScreen;
            // Changes the Window icon
            Uri iconUri = new Uri("Images/Ica.png", UriKind.RelativeOrAbsolute);
            this.Icon = BitmapFrame.Create(iconUri);

            // Scrolling
            ScrollViewer root = new ScrollViewer();
            root.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
            Content = root;

            // Main grid definition
            Grid mainGrid = new Grid();
            root.Content = mainGrid;
            mainGrid.RowDefinitions.Add(new RowDefinition());
            // First column contains the shoppingcart and product assortment.
            mainGrid.ColumnDefinitions.Add(new ColumnDefinition());
            // The second column displays the selected product and upon payment displays the receipt
            mainGrid.ColumnDefinitions.Add(new ColumnDefinition());
            mainGrid.Background = backgroundBrush;

            #region grid definiton for the Expander in leftGrid
            Grid expanderCartGrid = new Grid();
            expanderCartGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            expanderCartGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            expanderCartGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            expanderCartGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            expanderCartGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            expanderCartGrid.RowDefinitions.Add(new RowDefinition());
            expanderCartGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            expanderCartGrid.ColumnDefinitions.Add(new ColumnDefinition());
            expanderCartGrid.ColumnDefinitions.Add(new ColumnDefinition());

            TextBlock cartTextBlock = ShopUtils.CreateTextBlock("Varukorg", 18, TextAlignment.Center);
            expanderCartGrid.Children.Add(cartTextBlock);
            Grid.SetRow(cartTextBlock, 0);
            Grid.SetColumn(cartTextBlock, 0);
            Grid.SetColumnSpan(cartTextBlock, 2);

            TextBlock discountTextBlock = ShopUtils.CreateTextBlock("Mata in rabattkod nedan", 12, TextAlignment.Center);
            expanderCartGrid.Children.Add(discountTextBlock);
            Grid.SetRow(discountTextBlock, 1);
            Grid.SetColumn(discountTextBlock, 0);
            Grid.SetColumnSpan(discountTextBlock, 1);

            // A combobox to display available coupons to the user
            couponComboBox = new ComboBox
            {
                HorizontalAlignment = HorizontalAlignment.Right,
                Height                   = 18,
                Margin                   = new Thickness(0, 5, 5, 5),
                BorderThickness          = new Thickness(0),
                VerticalContentAlignment = VerticalAlignment.Top,
                Padding                  = new Thickness(5, 1, 5, 0),
            };
            expanderCartGrid.Children.Add(couponComboBox);
            Grid.SetRow(couponComboBox, 1);
            Grid.SetColumn(couponComboBox, 1);
            // add a default index at 0, can be selected to clear the couponTextBox.Text
            couponComboBox.Items.Add("Dina rabattkoder");
            couponComboBox.SelectedIndex     = 0;
            couponComboBox.SelectionChanged += AddToCouponTextBox;
            // Adds all available coupons to the couponComboBox items from the couponList which recieves predetermined coupons from file
            foreach (var coupon in couponList)
            {
                couponComboBox.Items.Add(coupon.Code + " " + (100 - Math.Round(coupon.Discount * 100, 0)) + "%");
            }

            // A textbox for the user to enter coupon codes
            couponTextBox = new TextBox
            {
                Margin          = new Thickness(5),
                Background      = textBoxBrush,
                Foreground      = Brushes.White,
                BorderThickness = new Thickness(0),
                FontWeight      = FontWeights.SemiBold
            };
            expanderCartGrid.Children.Add(couponTextBox);
            Grid.SetRow(couponTextBox, 2);
            Grid.SetColumnSpan(couponTextBox, 1);

            ShopUtils.CreateButton("Använd rabattkod", expanderCartGrid, 2, 2, 1, ValidateCoupon);
            ShopUtils.CreateButton("Rensa varukorg", expanderCartGrid, row: 3, column: 0, columnspan: 1, ClearCartClick);
            ShopUtils.CreateButton("Spara varukorg", expanderCartGrid, 3, 1, 1, SaveCartClick);
            ShopUtils.CreateButton("Ta bort en vald produkt", expanderCartGrid, row: 4, column: 0, columnspan: 1, RemoveProductClick);
            ShopUtils.CreateButton("Ta bort varje vald produkt", expanderCartGrid, 4, 1, 1, RemoveAllSelectedProductsClick);

            // the cartListBox display all products in the shoppingCart list
            cartListBox = new ListBox
            {
                Margin              = new Thickness(5),
                VerticalAlignment   = VerticalAlignment.Stretch,
                HorizontalAlignment = HorizontalAlignment.Stretch,
                MaxHeight           = 200,
                MinHeight           = 200,
                Background          = listBoxBrush,
                Foreground          = Brushes.White,
                BorderThickness     = new Thickness(0),
                FontWeight          = FontWeights.SemiBold
            };
            expanderCartGrid.Children.Add(cartListBox);
            Grid.SetRow(cartListBox, 5);
            Grid.SetColumnSpan(cartListBox, 2);

            sumTextBlock = ShopUtils.CreateTextBlock("Varukorgens summa: 0 kr", 12, TextAlignment.Left);
            expanderCartGrid.Children.Add(sumTextBlock);
            Grid.SetRow(sumTextBlock, 6);
            Grid.SetColumn(sumTextBlock, 0);
            Grid.SetColumnSpan(sumTextBlock, 1);

            ShopUtils.CreateButton("Till kassan", expanderCartGrid, 6, 1, 1, ShowReceipt);
            #endregion

            #region leftGrid definition
            Grid leftGrid = new Grid();
            mainGrid.Children.Add(leftGrid);
            leftGrid.ColumnDefinitions.Add(new ColumnDefinition());
            leftGrid.ColumnDefinitions.Add(new ColumnDefinition());
            leftGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            leftGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            leftGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            leftGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            leftGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            leftGrid.RowDefinitions.Add(new RowDefinition {
                Height = GridLength.Auto
            });
            leftGrid.RowDefinitions.Add(new RowDefinition());
            Grid.SetRow(leftGrid, 0);
            Grid.SetColumn(leftGrid, 0);

            // Expander definition, when expanded the expanderCartGrid will be displayed in the leftGrid
            cartExpander = new Expander
            {
                // sets the expanders content to the expanderCartGrid defined above
                Content    = expanderCartGrid,
                Header     = "Din varukorg 0 kr",
                FontWeight = FontWeights.SemiBold,
                Foreground = Brushes.White,
                Background = expanderBrush
            };
            leftGrid.Children.Add(cartExpander);
            Grid.SetRow(cartExpander, 0);
            Grid.SetColumn(cartExpander, 0);
            // when expanded the cartExpander's columnspan increases to take up two columns and when collapsed shrinks to one column
            cartExpander.Collapsed += DecreaseCartColumnSpan;
            cartExpander.Expanded  += IncreaseCartColumnSpan;
            // Update the cartListBox in the Expander to add items from the shoppingCart list
            UpdateCartListBox();

            TextBlock products = ShopUtils.CreateTextBlock("Produkter", 18, TextAlignment.Center);
            leftGrid.Children.Add(products);
            Grid.SetRow(products, 1);
            Grid.SetColumn(products, 0);
            Grid.SetColumnSpan(products, 2);

            TextBlock searchHeading = ShopUtils.CreateTextBlock("Sök efter produkt", 12, TextAlignment.Center);
            leftGrid.Children.Add(searchHeading);
            Grid.SetRow(searchHeading, 2);
            Grid.SetColumn(searchHeading, 0);
            Grid.SetColumnSpan(searchHeading, 2);

            // A textbox definition where the user can input a search term
            searchBox = new TextBox
            {
                Margin          = new Thickness(5),
                Background      = textBoxBrush,
                Foreground      = Brushes.White,
                BorderThickness = new Thickness(0),
                FontWeight      = FontWeights.SemiBold
            };
            leftGrid.Children.Add(searchBox);
            Grid.SetRow(searchBox, 3);
            Grid.SetColumnSpan(searchBox, 2);
            // when the searchbox text changes the ShowSearch event will run
            searchBox.TextChanged += ShowSearch;

            // A combobox which displays available categories
            categoryBox = new ComboBox
            {
                Margin          = new Thickness(5),
                BorderThickness = new Thickness(0),
                FontWeight      = FontWeights.SemiBold,
                Height          = 22,
            };
            leftGrid.Children.Add(categoryBox);
            Grid.SetRow(categoryBox, 4);
            Grid.SetColumn(categoryBox, 0);
            Grid.SetColumnSpan(categoryBox, 2);
            categoryBox.Items.Add("Välj kategori");
            categoryBox.SelectedIndex = 0;
            categoryList = ShopUtils.GenerateCategories(productList);
            // adds categories to the categoryBox
            foreach (string category in categoryList)
            {
                categoryBox.Items.Add(category);
            }
            categoryBox.SelectionChanged += ShowCategory;

            ShopUtils.CreateButton("Lägg till vald produkt", leftGrid, row: 5, column: 0, columnspan: 2, AddProductToCart);

            // Listbox definition, used to display the product assortment from the searchTermList
            productListBox = new ListBox
            {
                Margin              = new Thickness(5),
                VerticalAlignment   = VerticalAlignment.Stretch,
                HorizontalAlignment = HorizontalAlignment.Stretch,
                MaxHeight           = 425,
                Background          = listBoxBrush,
                Foreground          = Brushes.White,
                BorderThickness     = new Thickness(0),
                FontWeight          = FontWeights.SemiBold
            };
            leftGrid.Children.Add(productListBox);
            Grid.SetRow(productListBox, 6);
            Grid.SetColumn(productListBox, 0);
            Grid.SetColumnSpan(productListBox, 2);
            // set the searchTerm to empty string in order to add every product from the productList upon start
            UpdateProductListBox("");
            // selecting an item in the listbox will display productinformation in the stackpanel to the right
            productListBox.SelectionChanged += DisplaySelectedProduct;
            #endregion

            #region rightStackPanel definition
            StackPanel rightStackPanel = new StackPanel();
            mainGrid.Children.Add(rightStackPanel);
            Grid.SetRow(rightStackPanel, 0);
            Grid.SetColumn(rightStackPanel, 1);

            productHeading        = ShopUtils.CreateTextBlock("Välj produkt", 18, TextAlignment.Center, rightStackPanel);
            productHeading.Margin = new Thickness(5, 30, 5, 32);

            imageGrid = new Grid();
            rightStackPanel.Children.Add(imageGrid);

            // sets a startup image
            currentImage = ShopUtils.CreateImage("Images/Ica.png", false);
            imageGrid.Children.Add(currentImage);

            productDescriptionHeading     = ShopUtils.CreateTextBlock("", 16, TextAlignment.Center, rightStackPanel);
            productDescription            = ShopUtils.CreateTextBlock("", 12, TextAlignment.Center, rightStackPanel);
            productDescription.FontWeight = FontWeights.Thin;
            productDescription.Margin     = new Thickness(30, 5, 30, 5);
            #endregion
        }
        private void ShowReceipt(object sender, RoutedEventArgs e)
        {
            productHeading.Text            = "Ditt kvitto";
            productDescriptionHeading.Text = "Ditt köp har genomförts";
            productDescription.Text        = "Tack för att du handlar hos oss!";
            // without clearing the imageGrid a picture would still be visible behind the datagrid
            imageGrid.Children.Clear();

            decimal sum = 0;

            // DataGrid definition
            DataGrid receiptDataGrid = new DataGrid
            {
                Margin          = new Thickness(5),
                MaxWidth        = 450,
                MinHeight       = 300,
                MaxHeight       = 300,
                BorderThickness = new Thickness(0)
            };

            // prevents the user from altering the receipt
            receiptDataGrid.IsReadOnly = true;

            // DataTable definition, which is the DataGrid's itemsource
            DataTable receiptTable = new DataTable();

            // add columns for the receipt datatable
            receiptTable.Columns.Add(new DataColumn("Produkt", typeof(string)));
            receiptTable.Columns.Add(new DataColumn("Antal", typeof(int)));
            receiptTable.Columns.Add(new DataColumn("aPris", typeof(decimal)));
            receiptTable.Columns.Add(new DataColumn("Rabatt", typeof(decimal)));
            receiptTable.Columns.Add(new DataColumn("Summa", typeof(decimal)));

            //if a discount code has been validated the loop will add a product to a new row for each product in the shoppingCart list displaying the total discount for each product and summarize the total discount and price
            if (hasDiscount)
            {
                foreach (var product in shoppingCart)
                {
                    decimal discount = product.Price - (product.Price * currentCoupon.Discount);

                    receiptTable.Rows.Add(new object[]
                    {
                        product.Title,
                        product.Count,
                        product.Price,
                        Math.Round(-discount * product.Count, 2),
                        Math.Round(product.Price * product.Count * currentCoupon.Discount, 2)
                    });
                    sum += product.Price * product.Count;
                }
                // adds a bottom row containing total discount and total price with discount
                receiptTable.Rows.Add(new object[] { "Totalt", null, null, Math.Round(-(sum - (sum * currentCoupon.Discount)), 2), Math.Round((sum * currentCoupon.Discount), 2) });
            }
            //if no discount has been validated, the else statement set the discount values to null and present the products by adding a new row foreach product in the shoppingCart list
            else
            {
                foreach (var product in shoppingCart)
                {
                    receiptTable.Rows.Add(new object[]
                    {
                        product.Title,
                        product.Count,
                        product.Price,
                        null,
                        Math.Round(product.Price * product.Count, 2)
                    });
                    sum += product.Price * product.Count;
                }
                // adds a bottom row containing the total price
                receiptTable.Rows.Add(new object[] { "Totalt", null, null, null, Math.Round(sum, 2) });
            }
            // sets the datagrids content to the datatable containing the products
            receiptDataGrid.ItemsSource = receiptTable.DefaultView;
            // displays the datagrid in the imageGrid in the StackPanel
            imageGrid.Children.Add(receiptDataGrid);
            Grid.SetRow(receiptDataGrid, 0);
            Grid.SetColumn(receiptDataGrid, 0);

            // reset the shopping cart
            shoppingCart.Clear();
            string path = ShopUtils.GetFilePath("Cart.json");

            shoppingCart.Serialize(path);
            currentCoupon = null;
            hasDiscount   = false;
            couponComboBox.SelectedIndex = 0;
            UpdateCartListBox();
        }