public StyleReferencesViewModel(IUnitOfWork db, long?styleId, DateTime when)
        {
            if (styleId.HasValue)
            {
                var style       = db.Styles.Get(styleId.Value);
                var styleImages = db.StyleImages.GetAllAsDto()
                                  .Where(im => im.StyleId == style.Id && !im.IsSystem)
                                  .OrderBy(im => im.Id)
                                  .ToList();

                Id      = style.Id;
                StyleId = style.StyleID;
                Name    = style.Name;

                LinkedStyles = db.StyleReferences.GetByStyleId(styleId.Value);
                StyleItems   = db.StyleItems.GetByStyleIdAsDto(styleId.Value);

                AutoPriceIndex = Array.FindIndex(LinkedStyles.ToArray(), l => !l.Price.HasValue);

                ImageSet = new ImageCollectionViewModel(1);
                ImageSet.SetImages(styleImages);
            }
            else
            {
                LinkedStyles = new List <StyleReferenceDTO>();
                StyleItems   = new List <StyleItemDTO>();
                ImageSet     = new ImageCollectionViewModel(1);
            }
        }
        private long AddStyle(IUnitOfWork db, DateTime when, long?by)
        {
            var notEmptyLinkedStyles = LinkedStyles
                                       .Where(s => !String.IsNullOrEmpty(s.LinkedStyleString))
                                       .ToList();

            StyleViewModel.SetDefaultImage(ImageSet.Images);

            var dbStyle = new Style
            {
                StyleID       = StyleId,
                Type          = (int)StyleTypes.References,
                Name          = Name,
                DropShipperId = DSHelper.DefaultPAId,
                Image         = ImageSet.GetMainImageUrl(),
                //AdditionalImages = ImageSet.GetAdditionalImagesUrl(),

                ItemTypeId = (int)ItemType.Pajama,

                CreateDate = when,
                CreatedBy  = by
            };

            db.Styles.Add(dbStyle);
            db.Commit();

            StyleViewModel.UpdateImages(db, dbStyle.Id, ImageSet.Images, when, by);

            db.StyleReferences.UpdateStyleReferencesForStyle(dbStyle.Id,
                                                             notEmptyLinkedStyles,
                                                             when,
                                                             by);

            var styleItemToLinkedItems = RebuildStyleItems(db, dbStyle, notEmptyLinkedStyles);

            db.StyleItems.UpdateStyleItemsForStyle(dbStyle.Id,
                                                   styleItemToLinkedItems.Select(si => si.StyleItem).ToList(),
                                                   when,
                                                   by);

            var styleItemReferences = BuildStyleItemReferences(db, dbStyle.Id, styleItemToLinkedItems);

            db.StyleItemReferences.UpdateStyleItemReferencesForStyle(dbStyle.Id,
                                                                     styleItemReferences,
                                                                     when,
                                                                     by);

            UpdateStyleFeatures(db, dbStyle.Id, LinkedStyles.Select(s => s.LinkedStyleId).ToList(), when, by);

            return(dbStyle.Id);
        }
        public List <ValidationResult> Validate(IUnitOfWork db)
        {
            var result = new List <ValidationResult>();

            if (String.IsNullOrEmpty(StyleId))
            {
                result.Add(new ValidationResult("Style Id is empty"));
            }
            else
            {
                var existStyles = db.Styles.GetAllAsDto().Where(s => s.StyleID == StyleId).ToList();
                if (existStyles.Count > 1 || (existStyles.Count == 1 && existStyles[0].Id != Id))
                {
                    result.Add(new ValidationResult("Specified StyleId already exist"));
                }
            }

            var notEmptyLinkedStyles = LinkedStyles.Where(s => !String.IsNullOrEmpty(s.LinkedStyleString)).ToList();

            if (!notEmptyLinkedStyles.Any())
            {
                result.Add(new ValidationResult("At least the one linked style should be specified"));
            }
            else
            {
                var linkedStyleStringList = notEmptyLinkedStyles.Select(s => s.LinkedStyleString).ToList();
                var dbStyles = db.Styles.GetAllAsDto()
                               .Where(s => linkedStyleStringList.Contains(s.StyleID) &&
                                      !s.Deleted)
                               .ToList();

                foreach (var linkedStyle in notEmptyLinkedStyles)
                {
                    var existDbStyle = dbStyles.FirstOrDefault(s => s.StyleID == linkedStyle.LinkedStyleString);
                    if (existDbStyle == null)
                    {
                        result.Add(new ValidationResult(String.Format("Specified StyleId: \"{0}\" is not found in the system", linkedStyle.LinkedStyleString)));
                    }
                    else
                    {
                        linkedStyle.LinkedStyleId = existDbStyle.Id;
                    }
                }
            }

            return(result);
        }
        private void UpdateStyle(IUnitOfWork db, Style style, DateTime when, long?by)
        {
            var notEmptyLinkedStyles = LinkedStyles
                                       .Where(s => !String.IsNullOrEmpty(s.LinkedStyleString))
                                       .ToList();

            StyleViewModel.SetDefaultImage(ImageSet.Images);

            style.StyleID = StyleId;
            style.Name    = Name;

            style.Image = ImageSet.GetMainImageUrl();
            //style.AdditionalImages = ImageSet.GetAdditionalImagesUrl();

            style.UpdateDate = when;
            style.UpdatedBy  = by;

            db.Commit();

            StyleViewModel.UpdateImages(db, style.Id, ImageSet.Images, when, by);

            db.StyleReferences.UpdateStyleReferencesForStyle(style.Id,
                                                             notEmptyLinkedStyles,
                                                             when,
                                                             by);

            var styleItemToLinkedItems = RebuildStyleItems(db, style, notEmptyLinkedStyles);

            db.StyleItems.UpdateStyleItemsForStyle(style.Id,
                                                   styleItemToLinkedItems.Select(si => si.StyleItem).ToList(),
                                                   when,
                                                   by);

            var styleItemReferences = BuildStyleItemReferences(db, style.Id, styleItemToLinkedItems);

            db.StyleItemReferences.UpdateStyleItemReferencesForStyle(style.Id,
                                                                     styleItemReferences,
                                                                     when,
                                                                     by);
        }