using sql_pagining.models;
using System.ComponentModel;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Dapper;
using MySqlConnector;
using sql_pagining.Windows;

namespace sql_pagining
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void Invalidate()
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("productList"));
        }
        public int productsSelectedCount = 0;
        public decimal Result;
        private void CostChangeButton_Click(object sender, RoutedEventArgs e)
        {
            decimal sum = 0;
            List<int> idList = new List<int>();

            if (ProductListBox.SelectedItems.Count == 0)
            {
                MessageBox.Show("Выберите продукты для изменения цены.");
                return;
            }

            foreach (Product item in ProductListBox.SelectedItems)
            {
                sum += item.MinCostForAgent;
                idList.Add(item.ID);
            }
            var newWindow = new EnterMinCostForAgentWindow(sum / ProductListBox.SelectedItems.Count);

            if ((bool)newWindow.ShowDialog())
            {
                try
                {
                    Globals.dataProvider.setMinCostForAgent(newWindow.Result, idList.ToArray());
                    MessageBox.Show("Стоимость успешно изменена.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка: {ex.Message}");
                }
            }
        }
        private void ProductListBox_OnSelectionChanged(
    object? sender,
    SelectionChangedEventArgs e)
        {
            if (ProductListBox != null)
            {
                productsSelectedCount = ProductListBox.SelectedItems.Count;
            }
            Invalidate();
        }
        private int productCount;
        public List<String> pageList { get; set; } = new List<String>();
        public IEnumerable<Product> productList
        {
            get
            {

                Globals.dataProvider.clearFilter();
                if (productTypeFilterId > 0)
                    Globals.dataProvider.addFilter(
                        "ProductTypeID = @ProductTypeID",
                        new { ProductTypeID = productTypeFilterId }
                    );
                switch (sortType)
                {
                    case 0:
                        Globals.dataProvider.setOrder("");
                        break;
                    case 1:
                        Globals.dataProvider.setOrder("Title");
                        break;
                    case 2:
                        Globals.dataProvider.setOrder("Title DESC");
                        break;
                    case 3:
                        Globals.dataProvider.setOrder("ArticleNumber");
                        break;
                    case 4:
                        Globals.dataProvider.setOrder("ArticleNumber DESC");
                        break;
                    case 5:
                        Globals.dataProvider.setOrder("MaterialCost");
                        break;
                    case 6:
                        Globals.dataProvider.setOrder("MaterialCost DESC");
                        break;
                }
                if (searchFilter.Length > 0)
                {
                    Globals.dataProvider.addFilter(
                        "(Title LIKE @search OR Description LIKE @search)",
                        new { search = $"%{searchFilter}%" }
                    );
                }
                var result = Globals.dataProvider.getProduct(currentPage);


                productCount = Globals.dataProvider.getProductCount();


                pageList.Clear();
                pageList.Add("<");
                for (int i = 1; i < (productCount / Globals.PAGE_LEN) + 1; i++)
                {
                    pageList.Add(i.ToString());
                }
                pageList.Add(">");


                PageListListBox.ItemsSource = pageList;

                return result;
            }
            set
            {
                _productList = value;
                Invalidate();
            }
        }
        public List<ProductType> productTypeList { get; set; }
        public MainWindow()
        {


            InitializeComponent();
            DataContext = this;
            Globals.dataProvider = new DBDataProvider();
            productList = Globals.dataProvider.getProduct(currentPage);
            productTypeList = Globals.dataProvider.getProductTypes().ToList();
            productTypeList.Insert(0, new ProductType { Title = "Все типы продукции" });


        }
        public string[] sortList { get; set; } = {
    "Без сортировки",
    "название по убыванию",
    "название по возрастанию",
    "артикул по убыванию",
    "артикул по возрастанию",
    "цена по убыванию",
    "цена по возрастанию" };
        private IEnumerable<Product> _productList;
        private const int PAGE_LEN = 20;

        private int _currentPage = 1;
        private string searchFilter = "";
        private int currentPage
        {
            get
            {
                return _currentPage;
            }
            set
            {
                _currentPage = value;
                Invalidate();
            }
        }
        private void InputElement_OnPointerPressed(
    object? sender, MouseButtonEventArgs e)
        {
            switch ((sender as TextBlock).Text)
            {
                case "<":

                    if (currentPage > 1) currentPage--;
                    return;
                case ">":

                    if (currentPage < productCount / Globals.PAGE_LEN) currentPage++;
                    return;
                default:

                    currentPage = Convert.ToInt32(
                        (sender as TextBlock).Text
                    );
                    return;
            }
        }
        private int productTypeFilterId = 0;

        private void ProductTypeFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            productTypeFilterId = (ProductTypeFilter.SelectedItem as ProductType).ID;
            Invalidate();
        }
        private void ProductListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (ProductListBox != null)
            {
                productsSelectedCount = ProductListBox.SelectedItems.Count;
                CostChangeButton.Visibility = productsSelectedCount > 0 ? Visibility.Visible : Visibility.Collapsed;
            }
        }
        private void SearchFilter_KeyUp(object sender, KeyEventArgs e)
        {
            searchFilter = searchFilterTextBox.Text;
            Invalidate();
        }
        private int sortType = 0;
        private bool sortAsc = true;
        private void TextBlock_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            switch ((sender as TextBlock).Text)
            {
                case "<":

                    if (currentPage > 1) currentPage--;
                    return;
                case ">":

                    if (currentPage < productCount / Globals.PAGE_LEN) currentPage++;
                    return;
                default:

                    currentPage = Convert.ToInt32(
                        (sender as TextBlock).Text
                    );
                    return;
            }
        }
        private void SortTypeComboBox_SelectionChanged(
    object? sender,
    SelectionChangedEventArgs e)
        {
            if (SortTypeComboBox != null)
            {
                sortType = SortTypeComboBox.SelectedIndex;
                Invalidate();
            }
        }
        private void SearchFilterTextBox_OnKeyUp(object? sender, KeyEventArgs e)
        {
            if (searchFilterTextBox.Text != null && searchFilterTextBox.Text != "")
            {
                searchFilter = searchFilterTextBox.Text;
                Invalidate();
            }
        }
        private void ExitButton_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();
        }
        public string costChangeButtonVisible
        {
            get
            {
                return productsSelectedCount > 1 ? "Visible" : "Hidden";
            }
        }
        private void ProductListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var product = (sender as ListBox).SelectedItem as Product;
            var editWindow = new EditProductWindow(product);
            editWindow.ShowDialog();

        }
    }

}