using System;
using System.Windows.Input;
using Xamarin.Forms;

namespace TINK.ViewModel.Info.BikeInfo
{
    public class CourouselPageItemViewModel
    {
        public CourouselPageItemViewModel(
            string p_strTitle,
            string p_strLegend,
            int p_iCurrentPageIndex,
            Func<int> p_iPagesCountProvider,
            Action p_oCloseAction,
            ImageSource image = null)
        {
            Title = p_strTitle;
            IsImageVisble = image != null;
            if (IsImageVisble)
            {
                Image = image;
            }

            DescriptionText = p_strLegend;
            CurrentPageIndex = p_iCurrentPageIndex;
            PagesCountProvider = p_iPagesCountProvider;
            CloseAction = p_oCloseAction;
        }

        /// <summary> Gets the title of the navigation page. </summary>
        public string Title { get; }

        public bool IsImageVisble { get; }

        /// <summary> Gets the image. </summary>
        public ImageSource Image { get; }

        /// <summary> Gets the text which describes the image. </summary>
        public string DescriptionText { get; }

        /// <summary> Get the progress of the carousselling progress.</summary>
        public double ProgressValue
        {
            get
            {
                var l_oCount = PagesCountProvider();

               return l_oCount > 0 ? (double)CurrentPageIndex / l_oCount : 0;
            }
        }

        /// <summary> Gets if user can leave carousel page.</summary>
        public bool IsCloseVisible
        {
            get
            {
                return PagesCountProvider() == CurrentPageIndex;
            }
        }

        /// <summary>
        /// Commang object to bind login button to view model.
        /// </summary>
        public ICommand OnCloseRequest
        {
            get
            {
                return new Command(() => CloseAction());
            }
        }

        /// <summary> Returns one based index of the current page. </summary>
        private int CurrentPageIndex { get;  }

        /// <summary> Gets the count of carousel pages. </summary>
        private Func<int> PagesCountProvider { get; }

        /// <summary> Action to actuate when close is invoked. </summary>
        private Action CloseAction { get; }
    }
}