using Serilog;
using System;
using System.Threading.Tasks;
using TINK.Model.State;
using TINK.Model.User;
using TINK.View;

namespace TINK.ViewModel.Bikes.Bike.BC.RequestHandler
{
    public class NotLoggedIn : IRequestHandler
    {
        /// <param name="bikesViewModel">View model to be used for progress report and unlocking/ locking view.</param>
        public NotLoggedIn(
             InUseStateEnum state,
             IViewService viewService,
             IBikesViewModel bikesViewModel,
             IUser activeUser)
        {
            State = state;
            IsIdle = true;
            ViewService = viewService;
            BikesViewModel = bikesViewModel
                ?? throw new ArgumentException($"Can not construct {GetType().Name}-object. {nameof(bikesViewModel)} must not be null.");
        }
        public InUseStateEnum State { get; }

        public bool IsButtonVisible => true;

        public bool IsIdle { get; private set; }

        public string ButtonText => State.GetActionText();

        public string ActionText { get => BikesViewModel.ActionText; private set => BikesViewModel.ActionText = value; }

        /// <summary>
        /// Reference on view service to show modal notifications and to perform navigation.
        /// </summary>
        protected IViewService ViewService { get; }

        /// <summary>View model to be used for progress report and unlocking/ locking view.</summary>
        public IBikesViewModel BikesViewModel { get; }

        public bool IsConnected => throw new NotImplementedException();

        /// <summary> Gets if the bike has to be removed after action has been completed. </summary>
        public bool IsRemoveBikeRequired => false;

        public async Task<IRequestHandler> HandleRequest()
        {
            Log.ForContext<NotLoggedIn>().Information("User selected bike but is not logged in.");

            // User is not logged in
            ActionText = string.Empty;
            var l_oResult = await ViewService.DisplayAlert(
                "Hinweis",
                "Bitte anmelden vor Reservierung eines Fahrrads!\r\nAuf Anmeldeseite wechseln?",
                "Ja",
                "Nein");

            if (l_oResult == false)
            {
                // User aborted booking process
                IsIdle = true;
                return this;
            }

            try
            {
                // Switch to login page
#if USEFLYOUT
                ViewService.ShowPage(ViewTypes.LoginPage);
#else
                await ViewService.ShowPage("//LoginPage");
#endif

            }
            catch (Exception p_oException)
            {
                Log.ForContext<BikesViewModel>().Error("Ein unerwarteter Fehler ist in der Klasse NotLoggedIn aufgetreten. Kontext: Aufruf nach Reservierungsversuch ohne Anmeldung. {@Exception}", p_oException);
                IsIdle = true;
                return this;
            }

            IsIdle = true;
            return this;
        }
    }
}