using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MsBox.Avalonia;
using MsBox.Avalonia.Enums;
using ReactiveUI;
using TravelAroundRussia.Models;

namespace TravelAroundRussia.ViewModels
{
    /// <summary>
    /// Модель [Добавления/Редактирования] отеля 
    /// </summary>
    public class EditHotelPageViewModel : ReactiveObject
    {
        bool edit = false;//флаг редактирования
        string headerPage = "";//текст заголовка страницы
        string countStar = "0";//количество звезд[локальный, так как возникли проблемы при передачи обычного параметра]
        bool tourCheck = false;//необходимость добавления всех туров для данного отеля
        Hotel hotel = new Hotel();//локальный объект Отеля
        List<Country> countries = MainWindowViewModel.baseConnection.Countries.ToList();//коллекция стран из бд
        /// <summary>
        /// Конструктор без параметров
        /// </summary>       
        public EditHotelPageViewModel()
        {
            HeaderPage = "Добавление отеля";//редактируем заголовок
            hotel.Id = 0;//присваиваем id отеля
        }
        /// <summary>
        /// Конструктор с параметром [id отеля]
        /// </summary>
        /// <param name="id">Id отеля</param>
        public EditHotelPageViewModel(int id)
        {
            HeaderPage = "Редактирование отеля";//редактируем заголовок
            Hotel = MainWindowViewModel.baseConnection.Hotels.First(tb => tb.Id == id);//инициализируем отель
            Star = Hotel.CountOfStars.ToString();//передаем количество звезд локальному параметру
            Edit = true;//меняем флаг редактирования
        }
        /// <summary>
        /// Свойство Заголовок, которое заново отрисовывается если меняется его значение
        /// </summary>
        public string HeaderPage { get => headerPage; set => this.RaiseAndSetIfChanged(ref headerPage, value); }
        /// <summary>
        /// Свойство Количество звезд, которое заново отрисовывается если меняется его значение
        /// </summary>
        public string Star{ get => countStar;set => this.RaiseAndSetIfChanged(ref countStar, value);}
        /// <summary>
        /// Свойство Список стран[только названия], только на вывод
        /// </summary>
        public List<String> Countries { get => countries.Select(tb => tb.Name).ToList(); }
        /// <summary>
        /// Свойство Выбранная страна
        /// </summary>
        public string SelectedCountry
        {
            //если страны нет, выводим пустую строку, иначе по коду ищем ее название
            get =>(Hotel.CountryCode == null)? "":countries.First(tb => tb.Code == Hotel.CountryCode).Name;                   
            //если значение не выбрано, присваивается пустое значение, иначе по названию ищется код
            set => Hotel.CountryCode = (value != null) ? countries.First(tb => tb.Name == value).Code : "";
        }
        /// <summary>
        /// Свойство Имя отеля
        /// </summary>
        public string Name
        {
            //если нет названия передаем пустую строку
            get => (Hotel.Name != null) ? Hotel.Name : "";
            //присваиваем введенное значение
            set => Hotel.Name = value;
        }
        /// <summary>
        /// Свойство Описание отеля
        /// </summary>
        public string Description
        {
            //если нет описания передаем пустую строку
            get => (Hotel.Description != null) ? Hotel.Description : "";
            //присваиваем введенное значение
            set => Hotel.Description = value;
        }
        /// <summary>
        /// Свойство Добавления всех туров, которое заново отрисовывается если меняется его значение
        /// </summary>
        public bool TourCheck { get => tourCheck; set => this.RaiseAndSetIfChanged(ref tourCheck, value); }
        /// <summary>
        /// Свойство Отель [для внешнего взаимодействия]
        /// </summary>
        public Hotel Hotel { get => hotel; set => hotel = value; }
        /// <summary>
        /// Свойство Редактирования страницы [для внешнего взаимодействия]
        /// </summary>
        public bool Edit { get => edit; set => edit = value; }
    }
}