public ProductItemsViewModel(
            IProductsProvider productsProvider,
            IProductsSearcher productsSearcher,
            IOrderBuilder orderBuilder,
            IPageNavigator pageNavigator)
        {
            Contract.Assert(productsProvider != null);
            Contract.Assert(orderBuilder != null);
            Contract.Assert(pageNavigator != null);

            _productsProvider = productsProvider;
            _productsSearcher = productsSearcher;
            _orderBuilder = orderBuilder;
            _pageNavigator = pageNavigator;
            SearchCommand = new LambdaCommand(
                parameter =>
                {
                    var searchResult = _productsSearcher.Search(SearchQuery);
                    Products = searchResult.Select(CreateProductViewModel);
                });

            GotoOrderCommand = new LambdaCommand(
                _ =>
                {
                    _pageNavigator.NavigateToOrderPage(new OrderViewModel(_orderBuilder.GetOrder(), _pageNavigator));
                });

            InitializeProducts();
        }
        public AddServicePageViewModel(
            IServicesManager servicesManager,
            INavigationService navigator)
        {
            _servicesManager = servicesManager;
            _navigator = navigator;
            
            Submit = new LambdaCommand(
                _ =>
                {
                    _servicesManager.AddServiceAsync(
                        new ServiceInformation(
                            string.IsNullOrEmpty(ServiceName) ? DefaultServiceName : ServiceName,
                            new PasswordRestriction(
                                CollectSymbolTypes(),
                                PasswordMinLength,
                                PasswordMaxLength)));

                    _navigator.GoBack();
                });
        
            ServiceName = DefaultServiceName;
            PasswordMinLength = PasswordRestriction.DefaultMinLength;
            PasswordMaxLength = PasswordRestriction.DefaultMaxLength;
            AllowLowLatin = true;
            AllowUpperLatin = true;
        }
        public ServicesPageViewModel(
            IServicesManager servicesManager, 
            INavigationService navigationService,
            ISessionStateService sessionStateService)
        {
            Contract.Assert(servicesManager != null);
            Contract.Assert(navigationService != null);
            Contract.Assert(sessionStateService != null);

            _dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
            _servicesManager = servicesManager;
            _sessionStateService = sessionStateService;
            Services = new ObservableCollection<ServiceInformation>();
            NavigateToService = new LambdaCommand(
                parameter =>
                {
                    Contract.Assert(parameter is ServiceInformation);

                    if (_sessionStateService.SessionState.ContainsKey(nameof(ServiceInformation)))
                    {
                        _sessionStateService.SessionState.Remove(nameof(ServiceInformation));
                    }

                    _sessionStateService.SessionState.Add(nameof(ServiceInformation), parameter);
                    navigationService.Navigate(PageTokens.GeneratePassword, null);
                });

            NavigateToAddService = new LambdaCommand(_ => navigationService.Navigate(PageTokens.AddService, null));

            _servicesManager.ServicesUpdated += ResetServicesSync;

            ResetServicesSync();
        }
        public ProductViewModel(Product product, IOrderBuilder orderBuilder)
        {
            Contract.Assert(product != null);
            Contract.Assert(orderBuilder != null);

            _orderBuilder = orderBuilder;
            Product = product;

            AddToOrder = new LambdaCommand(parameter => _orderBuilder.AddProduct(Product));
        }
        public OrderViewModel(
            Order order,
            IPageNavigator pageNavigator)
        {
            Contract.Assert(order != null);
            Contract.Assert(pageNavigator != null);

            Order = order;
            GoBack = new LambdaCommand(
                _ =>
                {
                    pageNavigator.NavigateToProductsPage();
                });
        }
        public GeneratePasswordPageViewModel(
            IServicesManager servicesManager,
            ISessionStateService sessionStateService,
            INavigationService navigationService)
        {
            Contract.Assert(sessionStateService != null);

            _sessionStateService = sessionStateService;
            _service = null;
            _servicePassword = null;

            GenerateServicePassword = new LambdaCommand(
                parameter =>
                {
                    var password = parameter as string;
                    if (password?.Length > 0)
                    {
                        ServicePassword = ServicePasswordGenerator.GeneratePassword(
                            Service,
                            password);
                    }
                },
                _ => Service != null);

            CopyServicePassword = new LambdaCommand(
                _ =>
                {
                    _dataPackage.SetText(ServicePassword);
                    Clipboard.SetContent(_dataPackage);
                },
                _ => ServicePassword?.Length > 0);

            RemoveService = new LambdaCommand(
                _ =>
                {
                    servicesManager.RemoveServiceAsync(Service.UniqueToken);
                    navigationService.GoBack();
                });
        }