using inutralia.Models;
using System.Threading.Tasks;
using MvvmHelpers;    // Este namespace está en el paquete Refractored.MvvmHelpers
using Xamarin.Forms;

namespace inutralia.ViewModels
{
	public class GenericListViewModel : BaseViewModel
	{
		public GenericListViewModel()
		{
		}

		//Lista de menús genéricos
		ObservableRangeCollection<Generic> _Generics;

		// Comando de update del listado
		Command _RefreshGenericsCommand;

		// Acceso a la lista de menús genéricos
		public ObservableRangeCollection<Generic> Generics
		{ 
			// Getter (lazy load), crea la lista si no existe
			get { return _Generics ?? (_Generics = new ObservableRangeCollection<Generic>()); }

			// Setter. Cambia el valor y notifica a la vista de dicho cambio
			set 
			{
				_Generics = value;
				OnPropertyChanged("Generics");
			}
		}

        /// <summary>
        /// Método que realiza la carga inicial del listado
        /// </summary>
        public async Task ExecuteLoadGenericsCommand()
		{
			// Realiza el proceso de actualización si hay menos de un 
			// elemento en el listado
			if (Generics.Count < 1)
				await FetchGenerics();
		}

		/// <summary>
		/// Acceso al comando de actualización del listado
		/// </summary>
		public Command RefreshGenericsCommand
		{
			// Getter (lazy load), crea el comando si no existe
			get { return _RefreshGenericsCommand ?? (_RefreshGenericsCommand = new Command(async () => await ExecuteRefreshGenericsCommand())); }
		}


		/// <summary>
		/// Proceso de ejecución del comando de actualización del listado
		/// </summary>
		async Task ExecuteRefreshGenericsCommand()
		{
			// Hace que el comando no se pueda ejecutar de nuevo
			RefreshGenericsCommand.ChangeCanExecute();

			// Realiza el proceso de actualización
			await FetchGenerics();

			// Hace que el comando pueda volver a ejecutarse
			RefreshGenericsCommand.ChangeCanExecute();
		}

		/// <summary>
		/// Proceso de actualización del listado
		/// </summary>
		async Task FetchGenerics()
		{
			// Indicamos que estamos ocupados (provoca que aparezca el indicador de carga)
			IsBusy = true;

			// Llamada al API para coger el listado (provoca que se actualize la vista del listado)
			// Nota: Al obtener el listado, el controlador Rest del servidor no retorna el cuerpo de
			// la notificación (campo Body)
			try
			{
				Generics = new ObservableRangeCollection<Generic>(await App.API.RefreshListAsync<Generic>());
			}
			catch (System.Exception)
			{

				Generics.Clear();
			}

			// Indicamos que ya no estamos ocupados (provoca que desaparezca el indicador de carga)
			IsBusy = false;
		}
	}
}