using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TravelAgencyWindow.Data;

namespace TravelAgencyWindow.Model.ListModel
{
    /// <summary>
    /// Класс для работы со списком туров.
    /// </summary>
    internal class ListTour : INotifyPropertyChanged
    {
        //Данные для списков.
        List<Tour> defultTours;
        List<Tour> currentTours;
        List<Type> types;
        //Добавление сортировки цены.
        List<SortingByPrice> catSortingByPrice = new List<SortingByPrice> {
        new SortingByPrice(0, "По умолчанию"),
        new SortingByPrice(1, "По убыванию"),
        new SortingByPrice(2, "По возрастанию")};
        //данные для вывода списка в зависимости от фильтров.
        string nameTour = null;
        int idType;
        bool checkIsActual = false;
        int idSorting;
        decimal summaryPrice = 0;

        /// <summary>
        /// Стандартная инициализация данных списка (данные без фильтров или фильтры по умолчанию)
        /// </summary>
        public ListTour()
        {
            defultTours = GlobalData.ConnectionDB.Tour.ToList();
            currentTours = defultTours;
            summaryPrice = currentTours.Sum(t => t.Price * (decimal)t.TicketCount);
            Types = GlobalData.ConnectionDB.Type.ToList();
            Types.Insert(0, new Type { Name = "Все типы" });
            idType = 0;
            idSorting = 0;
        }

        /// <summary>
        /// Выборка данных по фильтрам.
        /// </summary>
        public void SelectCurrentListTour()
        {
            List<Tour> currentTours = defultTours;
            //Выборка по имени для поиска.
            if (!(string.IsNullOrEmpty(nameTour)))
            {
                currentTours = currentTours.Where(x => x.Name.ToLower().Contains(nameTour.ToLower())).ToList();
            }
            //Выборка по id типа для вывода типа тура.
            if (idType != 0)
            {
                currentTours = currentTours.Where(x => x.Type.Contains(GlobalData.ConnectionDB.Type.FirstOrDefault(y => y.Id == idType))).ToList();
            }
            //Выборка по актуальности.
            if (checkIsActual)
            {
                currentTours = currentTours.Where(x => x.IsActual == checkIsActual).ToList();
            }
            //Для сортировки по цене.
            if (IdSorting == 1)
            {
                currentTours = currentTours.OrderByDescending(x => x.Price).ToList();
            }
            else if (IdSorting == 2)
            {
                currentTours = currentTours.OrderBy(x => x.Price).ToList();
            }
            CurrentTours = currentTours;
        }

        /// <summary>
        /// Список туров с фильтрами.
        /// </summary>
        public List<Tour> CurrentTours
        {
            get => currentTours; set
            {
                currentTours = value;
                SummaryPrice = currentTours.Sum(t => t.Price * (decimal)t.TicketCount);
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(CurrentTours)));
            }
        }
        /// <summary>
        /// Свойство для имени тура, передающееся на view (поиск).
        /// </summary>
        public string NameTour
        {
            get => nameTour;
            set
            {
                nameTour = value;
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(NameTour)));
                SelectCurrentListTour();
            }
        }
        /// <summary>
        /// Свойство для имени тура, передающееся на view (поиск).
        /// </summary>
        public int TypeViewId
        {
            get => idType;
            set
            {
                idType = value;
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(TypeViewId)));
                SelectCurrentListTour();

            }
        }

        /// <summary>
        /// Список типов туров (нужен для combobox).
        /// </summary>
        public List<Type> Types { get => types; set => types = value; }

        /// <summary>
        /// Свойство для проверки акутальности.
        /// </summary>
        public bool CheckIsActual
        {
            get => checkIsActual;
            set
            {
                checkIsActual = value;

                SelectCurrentListTour();
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(CheckIsActual)));
            }
        }

        /// <summary>
        /// Список элементов для сортировки цены (нужен для combobox).
        /// </summary>
        public List<SortingByPrice> CatSortingByPrice { get => catSortingByPrice; set => catSortingByPrice = value; }

        public int IdSorting
        {
            get => idSorting;
            set
            {
                idSorting = value;
                SelectCurrentListTour();
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(IdSorting)));

            }
        }

        /// <summary>
        /// Свойство для подсчета общей стоимости туров с учетом билетов.
        /// </summary>
        public decimal SummaryPrice
        {
            get => summaryPrice;
            set
            { 
                summaryPrice = value;
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(SummaryPrice)));
            }
        }

        /// <summary>
        /// Интерфейс для сообщения view об изменениях модели.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

    }
}
