DefaultViewModel.cs

171 lines | 4.216 kB Blame History Raw Download
namespace Web.ViewModels
{
    using System;
    using System.Collections.Generic;

    public class DefaultViewModel : SiteViewModel
    {
        public FirstViewModel First { get; set; }
        public SecondViewModel Second { get; set; }
        public ThirdViewModel Third { get; set; }
        public WizardNavigationViewModel Wizard { get; set; }

        public DefaultViewModel()
        {
            Wizard = new WizardNavigationViewModel(new List<string>
            {
                "First",
                "Second",
                "Third"
            }, 1);

            Initialize();
        }

        private void Initialize()
        {
            First = new FirstViewModel();
            if (!First.IsInitialized)
                First.Initialize();

            Wizard.ShowNavigation();
        }

        public void OnNextClick()
        {
            Wizard.OnNextClick();

            if (Wizard.Step == 2)
            {
                if (Second == null)  // TODO resolve with IOC
                    Second = new SecondViewModel();

                if (!Second.IsInitialized)
                    Second.Initialize();
            }

            if (Wizard.Step == 3)
            {
                if (Third == null)  // TODO resolve with IOC
                    Third = new ThirdViewModel();

                if (!Third.IsInitialized)
                    Third.Initialize();
            }
        }

        public void OnPreviousClick()
        {
            Wizard.OnPreviousClick();
        }
    }

    #region First
    public class FirstViewModel
    {
        public bool IsInitialized { get; set; }

        public void Initialize()
        {
            IsInitialized = true;
        }
    }
    #endregion

    #region Second
    public class SecondViewModel
    {
        public bool IsInitialized { get; set; }

        public void Initialize()
        {
            IsInitialized = true;
        }
    }
    #endregion

    #region Third
    public class ThirdViewModel
    {
        public bool IsInitialized { get; set; }

        public void Initialize()
        {
            IsInitialized = true;
        }
    }
    #endregion

    #region Wizard Navigation
    public class WizardNavigationViewModel
    {
        public int MinimumStep { get; set; }
        public bool NextButtonEnabled { get; set; }
        public bool NextButtonVisible { get; set; }
        public double Percentage => ((float)Step / Total) * 100.0;
        public int PreviousStep { get; set; }
        public bool PreviousButtonEnabled { get; set; }
        public bool PreviousButtonVisible { get; set; }
        public int Step { get; set; }
        public string Title => Titles[Step - 1];
        public string[] Titles { get; set; }
        public int Total => Titles.Length;
        public bool NavigationVisible { get; set; }

        public WizardNavigationViewModel(List<string> titles) : this(titles, 1)
        {
        }

        public WizardNavigationViewModel(List<string> titles, int minimumStep)
        {
            if (titles == null)
                throw new ArgumentNullException($"{nameof(titles)} is required.");

            if (titles.Count == 0)
                throw new ArgumentOutOfRangeException($"{nameof(titles)} is empty.");

            MinimumStep = minimumStep;
            NextButtonVisible = true;
            PreviousButtonVisible = true;
            Step = 1;
            Titles = titles.ToArray();

            if (Total > 1)
                NextButtonEnabled = true;
        }

        public void HideNavigation() => NavigationVisible = false;

        public void OnNextClick()
        {
            if (Step >= Total)
                return;

            PreviousStep = Step;
            Step++;
            SetButtonStatus();
        }

        public void OnPreviousClick()
        {
            if (Step <= MinimumStep)
                return;

            PreviousStep = Step;
            Step--;
            SetButtonStatus();
        }

        public void ShowNavigation() => NavigationVisible = true;

        #region Private Methods
        private void SetButtonStatus()
        {
            NextButtonEnabled = Step < Total;
            PreviousButtonEnabled = Step > MinimumStep;
        }
        #endregion
    }
    #endregion
}