namespace inutralia.ViewModels
{

    using inutralia.Models;
    using MvvmHelpers;
    using System.Diagnostics;
    using System.Threading.Tasks;
    using Xamarin.Forms;

    public class NutriQuestionListViewModel : BaseNavigationViewModel
    {
        public NutriQuestionListViewModel()
        {

        }

        // Lista de conversaciones
        ObservableRangeCollection<Conversation> _Conversations;

        // Comando de update del listadd
        Command _RefreshConversationsCommand;

        // Acceso a la lista de conversaciones
        public ObservableRangeCollection<Conversation> Conversations
        {
            // Getter (lazy load), crea la lista si no existe
            get { return _Conversations ?? (_Conversations = new ObservableRangeCollection<Conversation>()); }

            // Setter. cambiar el valor y notifica a la vista de dicho cambio
            set
            {
                _Conversations = value;
                OnPropertyChanged("Conversations");
            }
        }

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

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


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

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

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

        /// <summary>
        /// Proceso de actualización del listado
        /// </summary>
        async Task FetchConversations()
        {
            // 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
            {
                Conversations = new ObservableRangeCollection<Conversation>(await App.API.RefreshListAsync<Conversation>());
            }
            catch (System.Exception e)
            {
                Debug.WriteLine(e.Message);
                Conversations.Clear();
            }

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