public virtual CheckoutViewModel CreateCheckoutViewModel(ICart cart, CheckoutPage currentPage, IPaymentMethodViewModel<PaymentMethodBase> paymentViewModel = null)
        {
            if (cart == null)
            {
                return CreateEmptyCheckoutViewModel(currentPage);
            }

            var shipments = _shipmentViewModelFactory.CreateShipmentsViewModel(cart).ToList();

            var viewModel = new CheckoutViewModel
            {
                CurrentPage = currentPage,
                Shipments = shipments,
                BillingAddress = CreateBillingAddressModel(),
                UseBillingAddressForShipment = shipments.Count == 1 && _addressBookService.UseBillingAddressForShipment(),
                StartPage = _contentLoader.Get<StartPage>(ContentReference.StartPage),
                AppliedCouponCodes = cart.GetFirstForm().CouponCodes.Distinct(),
                AvailableAddresses = new List<AddressModel>(),
                ReferrerUrl = GetReferrerUrl(),
                Payment = paymentViewModel,
            };

            UpdatePayment(viewModel);
                        
            var availableAddresses = GetAvailableAddresses();

            if (availableAddresses.Any())
            {
                viewModel.AvailableAddresses.Add(new AddressModel { Name = _localizationService.GetString("/Checkout/MultiShipment/SelectAddress") });
                
                foreach (var address in availableAddresses)
                {
                    viewModel.AvailableAddresses.Add(address);
                }
            }
            else
            {
                viewModel.AvailableAddresses.Add(new AddressModel { Name = _localizationService.GetString("/Checkout/MultiShipment/NoAddressFound") });
            }

            SetDefaultShipmentAddress(viewModel);

            _addressBookService.LoadAddress(viewModel.BillingAddress);
            PopulateCountryAndRegions(viewModel);

            return viewModel;
        }
 private void PopulateCountryAndRegions(CheckoutViewModel viewModel)
 {
     foreach (var shipment in viewModel.Shipments)
     {
         _addressBookService.LoadCountriesAndRegionsForAddress(shipment.Address);
     }
 }
        private void UpdatePayment(CheckoutViewModel viewModel)
        {
            viewModel.PaymentMethodViewModels = _paymentMethodViewModelFactory.GetPaymentMethodViewModels();
            var selectedPaymentMethod = viewModel.Payment == null ? 
                viewModel.PaymentMethodViewModels.First() :
                viewModel.PaymentMethodViewModels.Single(p => p.SystemName == viewModel.Payment.SystemName);

            viewModel.Payment = PaymentMethodViewModelResolver.Resolve(selectedPaymentMethod.SystemName, _orderFactory);
            viewModel.Payment.Description = selectedPaymentMethod.Description;
            viewModel.Payment.SystemName = selectedPaymentMethod.SystemName;
            viewModel.Payment.PaymentMethod.PaymentMethodId = selectedPaymentMethod.PaymentMethodId;
        }
 private void SetDefaultShipmentAddress(CheckoutViewModel viewModel)
 {
     if (viewModel.Shipments.Count == 1)
     {
         viewModel.Shipments[0].Address = viewModel.AvailableAddresses.SingleOrDefault(x => x.ShippingDefault) ?? viewModel.BillingAddress;
     }
 }