public async Task <IHttpActionResult> Update(int catalogId, UpdateCatalogViewModel model)
        {
            var catalog = await _companyCatalogService.GetCompanyCatalog(User.CompanyId(), catalogId);

            var myCompaniesAssignedToCatalog =
                await _companyCatalogService.GetCompaniesAssignedToCatalog(User.CompanyId(), catalogId);

            var newlyAssigned = model.CompaniesAssignedToCatalog.Where(o => model.CompaniesAssignedToCatalog.Any() &&
                                                                       myCompaniesAssignedToCatalog.All(n => o != n.CompanyId)).Select(c => c);

            var removed = myCompaniesAssignedToCatalog.Where(n =>
                                                             model.CompaniesAssignedToCatalog.All(o => n.CompanyId != o)).Select(c => c.CompanyId);

            foreach (var newlyAssignedCompanyId in newlyAssigned)
            {
                await _companyCatalogService.AssignCatalogToCompany(User.CompanyId(), newlyAssignedCompanyId, catalogId);
            }

            foreach (var removedCompanyId in removed)
            {
                await _companyCatalogService.RemoveCompanyFromAssignedCatalog(User.CompanyId(), removedCompanyId);
            }

            await _companyCatalogService.UpdateCompanyCatalog(User.CompanyId(), catalogId, new CatalogModel
            {
                Name        = model.Name,
                Description = model.Description
            });

            foreach (var newModel in model.ProductItems)
            {
                //var currentModel = catalog.Products
                //                    .Select(p => p.ProductItems.FirstOrDefault(pi => pi.ProductItemId == newModel.ProductItemId))
                //                    .FirstOrDefault();
                var currentModel = catalog.Products.SelectMany(p => p.ProductItems).FirstOrDefault(i => i.ProductItemId == newModel.ProductItemId);
                if (currentModel == null)
                {
                    throw new Exception();
                }

                if (currentModel.Available != newModel.Available)
                {
                    await _catalogProductItemService.ChangeProductAvailability(User.CompanyId(), catalogId, newModel.ProductItemId, newModel.Available);
                }

                await _catalogHelper.UpdateFixedRetailPrice(User.UserId(), User.CompanyId(), currentModel, newModel, catalogId);

                await _catalogHelper.UpdateRetailPrice(User.UserId(), User.CompanyId(), currentModel, newModel, catalogId);

                await _catalogHelper.UpdateResellerPrice(User.CompanyId(), currentModel, newModel, catalogId);
            }

            return(Ok(await _catalogHelper.GetCatalog(User.CompanyId(), catalogId)));
        }