using Sessioa.BaseModel;
using Sessioa.Classes;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;

namespace Sessioa.Pages
{
    /// <summary>
    /// Логика взаимодействия для ProductCard.xaml
    /// </summary>
    public partial class ProductCard : Page
    {
        User user = null;
        Product prEdit = null;
        List<string> imagePath = new List<string>();
        List<ProductCategory> categories = BaseClass.C_Base.ProductCategory.ToList();

        List<Manufacturer> manufacturersList = BaseClass.C_Base.Manufacturer.ToList();

        List<Provider> providerList = BaseClass.C_Base.Provider.ToList();
        int imActual = -1;
        bool state = true;
        bool resIm = false;
        public ProductCard(User userSign)
        {
            InitializeComponent();
            user = userSign;
            sett();
        }
        public ProductCard(User userSign, Product product)
        {
            InitializeComponent();
            state = false;
            prEdit = product;
            user = userSign;
            TB_Articule.Text = product.ProductArticleNumber;
            TB_Articule.IsReadOnly = true;
            TB_Title.Text = product.ProductName;
            TB_Description.Text = product.ProductDescription;
            sett();
            foreach (var imList in imagePath)
            {
                imActual++;
                if (imList == product.ProductPhoto)
                {
                    resIm = true;
                    break;
                }
            }
            if (resIm == true)
                ImageProd.Source = new BitmapImage(new Uri(imagePath[imActual], UriKind.Relative));

            CategoryProd.SelectedItem = categories[product.ProductCategory - 1];
            ManufacturedProd.SelectedItem = manufacturersList[product.ProductManufacturer - 1];
            ProviderProd.SelectedItem = providerList[product.ProductProvider - 1];
            TB_Price.Text = product.ProductCost.ToString();
            if (product.ProductDiscountAmount != null)
                TB_Discount.Text = product.ProductDiscountAmount.ToString();
            TB_Count.Text = product.ProductQuantityInStock.ToString();
        }
        public void sett()
        {
            FileInfo[] files = new DirectoryInfo($"{Directory.GetCurrentDirectory()}\\Photos").GetFiles();
            foreach (FileInfo file in files)
            {
                imagePath.Add("/Photos/" + file.Name);
                Debug.Write(file.Name);
            }

            CategoryProd.ItemsSource = categories;
            CategoryProd.DisplayMemberPath = "CategoryTitle";
            CategoryProd.SelectedValuePath = "CategoryId";

            ManufacturedProd.ItemsSource = manufacturersList;
            ManufacturedProd.DisplayMemberPath = "Manufacturer1";
            ManufacturedProd.SelectedValuePath = "ManufacturerId";

            ProviderProd.ItemsSource = providerList;
            ProviderProd.DisplayMemberPath = "Provider1";
            ProviderProd.SelectedValuePath = "ProviderId";
        }

        private void BT_save_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                Regex regArticule = new Regex("[A-z][0-9]{3}[A-z][0-9]");
                Regex regPrice = new Regex(@"(\d)");
                if (TB_Articule.Text.Length < 1)
                {
                    MessageBox.Show("Укажите артикул.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (!regArticule.IsMatch(TB_Articule.Text))
                {
                    MessageBox.Show("Неверный формат артикула. Пример: А000А0. Используются латинские буквы.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (TB_Price.Text.Length < 1)
                {
                    MessageBox.Show("Укажите стоимость.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (!regPrice.IsMatch(TB_Price.Text))
                {
                    MessageBox.Show("Неверный формат стоимости. Все символы должны быть целочисленными.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (Convert.ToDouble(TB_Price.Text) < 1 || !double.TryParse(TB_Price.Text, out double a))
                {
                    MessageBox.Show("Стоимость не может быть меньше 1.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if ((!regPrice.IsMatch(TB_Discount.Text) || !int.TryParse(TB_Discount.Text, out int c)) && TB_Discount.Text != string.Empty)
                    MessageBox.Show("Неверный формат скидки. Все символы должны быть целочисленными.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                else if ((Convert.ToInt32(TB_Discount.Text) > 99 || Convert.ToInt32(TB_Discount.Text) < 0) && TB_Discount.Text != string.Empty)
                    MessageBox.Show("Такая скидка не может быть применена. Скидка не может быть больше 99 и меньше 0.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                else if (TB_Count.Text.Length < 1)
                {
                    MessageBox.Show("Укажите количество товара.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (!regPrice.IsMatch(TB_Count.Text))
                {
                    MessageBox.Show("Неверный формат количества товара. Все символы должны быть целочисленными.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (Convert.ToInt32(TB_Count.Text) < 1)
                {
                    MessageBox.Show("Стоимость не может быть меньше 1.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (TB_Title.Text.Length < 1)
                {
                    MessageBox.Show("Заполните поле с названием товара.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (TB_Description.Text.Length < 1)
                {
                    MessageBox.Show("Заполните поле с описанием.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (CategoryProd.SelectedItem == null)
                {
                    MessageBox.Show("Категория товара не выбрана.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (ManufacturedProd.SelectedItem == null)
                {
                    MessageBox.Show("Производитель товара не выбран.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if (ProviderProd.SelectedItem == null)
                {
                    MessageBox.Show("Поставщик товара не выбран.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else
                {
                    if (state == true)
                    {
                        Product newProduct = new Product()
                        {
                            ProductArticleNumber = TB_Articule.Text,
                            ProductName = TB_Title.Text,
                            ProductDescription = TB_Description.Text,
                            ProductCategory = CategoryProd.SelectedIndex,
                            ProductManufacturer = ManufacturedProd.SelectedIndex,
                            ProductProvider = ProviderProd.SelectedIndex,
                            ProductCost = Convert.ToInt32(TB_Price.Text),
                            ProductQuantityInStock = Convert.ToInt32(TB_Count.Text)
                        };
                        if (imActual != -1)
                            newProduct.ProductPhoto = imagePath[imActual];
                        if (TB_Discount.Text.Length > 0)
                        {
                            newProduct.ProductDiscountAmount = Convert.ToByte(TB_Discount.Text);
                        }

                        bool res = false;

                        foreach (var item in BaseClass.C_Base.Product.ToList())
                        {
                            if (item.ProductArticleNumber == newProduct.ProductArticleNumber)
                            {
                                MessageBox.Show("Продукт с таким артикулом уже существует.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                                res = true;
                            }
                        }
                        if (res != true)
                        {
                            BaseClass.C_Base.Product.Add(newProduct);
                            BaseClass.C_Base.SaveChanges();
                            MessageBoxResult mbr = MessageBox.Show("Продукт добавлен", "Уведомление", MessageBoxButton.OK, MessageBoxImage.Information);
                            if (mbr == MessageBoxResult.OK)
                                FrameClass.C_Frame.Navigate(new ProductsPage(user));
                        }
                    }
                    else
                    {
                        Product edit = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == prEdit.ProductArticleNumber);
                        edit.ProductArticleNumber = TB_Articule.Text;
                        edit.ProductName = TB_Title.Text;
                        edit.ProductDescription = TB_Description.Text;
                        edit.ProductCategory = CategoryProd.SelectedIndex + 1;
                        edit.ProductManufacturer = ManufacturedProd.SelectedIndex + 1;
                        edit.ProductProvider = ProviderProd.SelectedIndex + 1;
                        edit.ProductCost = Convert.ToDecimal(TB_Price.Text);
                        edit.ProductQuantityInStock = Convert.ToInt32(TB_Count.Text);

                        if (resIm != false)
                            edit.ProductPhoto = imagePath[imActual];
                        if (TB_Discount.Text.Length > 0)
                        {
                            edit.ProductDiscountAmount = Convert.ToByte(TB_Discount.Text);
                        }


                        BaseClass.C_Base.SaveChanges();
                        MessageBoxResult mbr = MessageBox.Show("Продукт изменен", "Уведомление", MessageBoxButton.OK, MessageBoxImage.Information);
                        if (mbr == MessageBoxResult.OK)
                            FrameClass.C_Frame.Navigate(new ProductsPage(user));
                    }
                }
            }
            catch
            {
                MessageBox.Show("Неизвестная ошибка.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void BT_Back_Click(object sender, RoutedEventArgs e)
        {
            FrameClass.C_Frame.Navigate(new ProductsPage(user));
        }

        private void BackIm_Click(object sender, RoutedEventArgs e)
        {
            if (imActual == 0 || imActual == -1)
                imActual = imagePath.Count - 1;
            else
                imActual--;
            ImageProd.Source = new BitmapImage(new Uri(imagePath[imActual], UriKind.Relative));
        }

        private void NextIm_Click(object sender, RoutedEventArgs e)
        {
            if (imActual == imagePath.Count - 1 || imActual == -1)
                imActual = 0;
            else
                imActual++;
            ImageProd.Source = new BitmapImage(new Uri(imagePath[imActual], UriKind.Relative));
        }
    }
}
