using inutralia.Models;
using inutralia.Views;
using MvvmHelpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace inutralia.ViewModels
{
    public class TrivialListViewModel : BaseNavigationViewModel
    {
        public TrivialListViewModel ()
        {
        }

        // Lista de partidas
        ObservableRangeCollection<TrivialGame> _Games;

        // Acceso a la lista de partidas
        public ObservableRangeCollection<TrivialGame> Games
        {
            // Getter (lazy load), crea la lista si no existe
            get { return _Games ?? (_Games = new ObservableRangeCollection<TrivialGame> ()); }

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

        #region Crear partida

        Command _NewGameCommand;

        public Command NewGameCommand =>
            _NewGameCommand ?? (_NewGameCommand = new Command(async () => await ExecuteNewGameCommand ()));

        protected async Task ExecuteNewGameCommand ()
        {
            NewGameCommand.ChangeCanExecute ();

            List<TrivialQuestion> questions = null;

            try
            {
                questions = await App.API.RefreshListAsync<TrivialQuestion> ();
            }
            catch (Exception e)
            { }

            if (questions == null)
                questions = new List<TrivialQuestion> ()
                {
                    new TrivialQuestion ()
                    {
                        Id = -1,
                        Image = "",
                        Text = "¿Cuantas manzanas hay en la foto?",
                        Options = new List<string> () { "Ninguna", "Una", "Cuatro", "Más de cuatro" },
                        ValidIndex = 0
                    }
                };

            var game = TrivialGame.Create (questions);
            await App.LocalData.UpdateItemAsync (game, true);

            await PushAsync (new TrivialGameView ()
            {
                BindingContext = new TrivialGameViewModel (game)
            });


            NewGameCommand.ChangeCanExecute ();
        }

        #endregion

        #region Borrar partida

        Command _DeleteGameCommand;

        public Command DeleteGameCommand =>
            _DeleteGameCommand ?? (_DeleteGameCommand = new Command (async (parameter) => await ExecuteDeleteGameCommand (parameter as TrivialGame)));

        protected async Task ExecuteDeleteGameCommand (TrivialGame game)
        {
            // Verificar parámetro
            if (game != null)
            {
                // Indicamos que estamos ocupados (provoca que aparezca el indicador de carga)
                IsBusy = true;

                // Llamamos al API para borrar la notificación
                await App.LocalData.DeleteItemAsync (game);

                // Actualizamos la lista
                Games.Remove (game);

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

        #endregion


        /// <summary>
        /// Método que realiza la carga inicial del listado
        /// </summary>
        public async Task RefreshList ()
        {
            await FetchGames ();
        }

        /// <summary>
        /// Proceso de actualización del listado
        /// </summary>
        async Task FetchGames ()
        {
            // 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)
            try
            {
                Games = new ObservableRangeCollection<TrivialGame> (await App.LocalData.RefreshListAsync<TrivialGame> ());
            }
            catch (System.Exception e)
            {
                Games.Clear ();
            }

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



    }
}
