using Sessioa.BaseModel;
using Sessioa.Classes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace Sessioa.Pages
{
    /// <summary>
    /// Логика взаимодействия для OrderCard.xaml
    /// </summary>
    public partial class OrderCard : Page
    {
        List<Product> products = (List<Product>)Application.Current.Properties["ListOrderUser"];
        Dictionary<string, int> keyValuePairs = (Dictionary<string, int>)(Application.Current.Properties["ListOrderCountUser"]);
        User user = null;
        public OrderCard(User userSign)
        {
            InitializeComponent();
            user = userSign;
            LB_ProductsOrder.ItemsSource = products;
            if (keyValuePairs.Count == 0)
            {
                foreach (Product product in products)
                {
                    keyValuePairs.Add($"{product.ProductArticleNumber}", 1);
                }
            }
            else
            {
                foreach (Product product in products)
                {
                    try
                    {
                        keyValuePairs.Add($"{product.ProductArticleNumber}", 1);
                    }
                    catch { }
                }
            }
            CB_Punkt.ItemsSource = BaseClass.C_Base.PointsOfIssue.ToList();
            CB_Punkt.DisplayMemberPath = "PointName";
            CB_Punkt.SelectedValuePath = "PointID";
            ItogoSkidka();
        }

        private void countPr_Loaded(object sender, RoutedEventArgs e)
        {
            TextBlock textBlock = (TextBlock)sender;
            Product product = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == textBlock.Uid);
            if (product.ProductDiscountAmount != null)
                textBlock.TextDecorations = TextDecorations.Strikethrough;
        }

        private void countDPr_Loaded(object sender, RoutedEventArgs e)
        {
            TextBlock textBlock = (TextBlock)sender;
            Product product = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == textBlock.Uid);
            if (product.ProductDiscountAmount != null)
            {
                textBlock.Visibility = Visibility.Visible;
                textBlock.Text = $" {(double)(product.ProductCost - product.ProductCost * product.ProductDiscountAmount / 100)} ₽";
            }
        }

        private void Discount_Loaded(object sender, RoutedEventArgs e)
        {
            TextBlock textBlock = (TextBlock)sender;
            Product product = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == textBlock.Uid);
            if (product.ProductDiscountAmount != null)
            {
                textBlock.Visibility = Visibility.Visible;
                textBlock.Text = $"Скидка {product.ProductDiscountAmount}%";
            }
        }

        private void B_Back_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Properties["ListOrderCountUser"] = keyValuePairs;
            FrameClass.C_Frame.Navigate(new ProductsPage(user));
        }

        private void B_Save_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Properties["ListOrderUser"] = new List<Product>();
            Application.Current.Properties["ListOrderCountUser"] = new Dictionary<string, int>();
            if(CB_Punkt.SelectedIndex == -1)
                MessageBox.Show("Выберите пункт выдачи.", "Предупреждение", MessageBoxButton.OK, MessageBoxImage.Warning);
            else
            {
                try
                {
                    Random rnd = new Random();
                    int code = rnd.Next(100, 999);
                    Order newOrder = new Order()
                    {
                        //OrderID = BaseClass.C_Base.Order.OrderByDescending(x => x.OrderID).FirstOrDefault().OrderID + 1,
                        OrderStatus = 2,
                        OrderDate = DateTime.Now,
                        OrderPickupPoint = ((PointsOfIssue)CB_Punkt.SelectedItem).PointID,
                        UserID = user.UserID,
                        IssueCode = code
                    };
                    BaseClass.C_Base.Order.Add(newOrder);
                    BaseClass.C_Base.SaveChanges();
                    foreach (KeyValuePair<string, int> pair in keyValuePairs)
                    {
                        OrderProduct op = new OrderProduct()
                        {
                            OrderID = newOrder.OrderID,
                            ProductArticleNumber = pair.Key,
                            ProductCount = pair.Value
                        };
                        BaseClass.C_Base.OrderProduct.Add(op);
                    }
                    BaseClass.C_Base.SaveChanges();
                    MessageBoxResult res = MessageBox.Show($"Заказ оформлен. Код для выдачи: {code}. Отследить заказ можно в разделе \"Мои заказы\" на странице продуктов.", "Уведомление", MessageBoxButton.OK, MessageBoxImage.Information);
                    if (res == MessageBoxResult.OK)
                        FrameClass.C_Frame.Navigate(new ProductsPage(user));
                }
                catch
                {
                    MessageBoxResult res = MessageBox.Show("что-то сломалось.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }

        private void Back_B_Click(object sender, RoutedEventArgs e)
        {
            Button bBack = (Button)sender;
            Grid grid = (Grid)bBack.Parent;
            TextBlock textBlock = (TextBlock)grid.FindName("CountProduct");
            Product pr = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == bBack.Uid);
            if (pr != null)
            {
                foreach (KeyValuePair<string, int> pair in keyValuePairs)
                {
                    if (pair.Key == bBack.Uid)
                    {
                        if (pair.Value > 1)
                        {
                            keyValuePairs[pair.Key]--;
                            textBlock.Text = keyValuePairs[pair.Key].ToString();
                            break;
                        }
                    }
                }
            }
            ItogoSkidka();
        }

        private void Next_B_Click(object sender, RoutedEventArgs e)
        {
            Button bNext = (Button)sender;
            Grid grid = (Grid)bNext.Parent;
            TextBlock textBlock = (TextBlock)grid.FindName("CountProduct");
            Product pr = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == bNext.Uid);
            if (pr != null)
            {
                foreach (KeyValuePair<string, int> pair in keyValuePairs)
                {
                    if (pair.Key == bNext.Uid)
                    {
                        keyValuePairs[pair.Key]++;
                        textBlock.Text = keyValuePairs[pair.Key].ToString();
                        break;
                    }
                }
            }
            ItogoSkidka();
        }

        private void CountProduct_Loaded(object sender, RoutedEventArgs e)
        {
            TextBlock tb = (TextBlock)sender;
            if (keyValuePairs.Count > 0)
            {
                foreach (KeyValuePair<string, int> pair in keyValuePairs)
                {
                    if (pair.Key == tb.Uid)
                    {
                        tb.Text = keyValuePairs[pair.Key].ToString();
                        break;
                    }
                }
            }
        }
        public void ItogoSkidka()
        {
            decimal itogoBezSkidki = 0;
            foreach(Product item in products)
            {
                foreach(KeyValuePair<string, int> pair in keyValuePairs)
                {
                    if(pair.Key == item.ProductArticleNumber)
                    {
                        itogoBezSkidki += item.ProductCost * pair.Value;
                    }
                }
            }
            decimal itogoSoSkidkoy = 0;
            foreach (Product item in products)
            {
                foreach (KeyValuePair<string, int> pair in keyValuePairs)
                {
                    if (pair.Key == item.ProductArticleNumber)
                    {
                        if(item.ProductDiscountAmount != null)
                        {
                            itogoSoSkidkoy += (item.ProductCost - (item.ProductCost * ((decimal)item.ProductDiscountAmount / 100))) * pair.Value;
                        }
                        else
                            itogoSoSkidkoy += item.ProductCost * pair.Value;
                    }
                }
            }
            decimal ITOGO = Math.Round((1 - (itogoSoSkidkoy / itogoBezSkidki)) * 100, 2);
            TB_ItogoSkidka.Text = $"Скидка {ITOGO}%";
            TB_Itogo.Text = $"{(double)itogoSoSkidkoy} ₽";
        }
    }
}
