/// <summary>
        ///     Updates the CustomFieldsComponent from the ExternalSettingsComponent
        /// </summary>
        /// <param name="externalSettingsComponent"></param>
        /// <param name="sellableItem"></param>
        /// <returns></returns>
        public CustomFieldsComponent UpdateFromExternalSettingsComponent(ExternalSettingsComponent externalSettingsComponent, SellableItem sellableItem)
        {
            var updatedSettings  = ParseExternalSettings(externalSettingsComponent.Settings);
            var originalSettings = ParseExternalSettings(this.OriginalSettings);

            string[] allParents = GetAllParents(sellableItem);

            var newValues = this.CustomFields;

            if (allParents != null)
            {
                foreach (var parent in allParents)
                {
                    Guid parentId;
                    if (!string.IsNullOrEmpty(parent) && Guid.TryParse(parent, out parentId))
                    {
                        var deterministicId = GuidUtils.GetDeterministicGuid($"{sellableItem.SitecoreId}|{parent}");

                        if (!updatedSettings.ContainsKey(deterministicId))
                        {
                            updatedSettings[deterministicId] = new Dictionary <string, Dictionary <string, string> >();
                        }

                        // Check which parent was updated
                        if (originalSettings.ContainsKey(deterministicId) && HaveSettingsBeenUpdated(updatedSettings[deterministicId], originalSettings[deterministicId]))
                        {
                            var settings = updatedSettings[deterministicId];

                            if (!settings.ContainsKey(ExternalSettingsSharedFieldName))
                            {   // Create the language dictionary
                                settings[ExternalSettingsSharedFieldName] = new Dictionary <string, string>();
                            }

                            // Assign new values only checking the keys we have in the custom fields component
                            var currentDictionary = new Dictionary <string, string>(this.CustomFields);
                            foreach (var keyValuePair in currentDictionary)
                            {
                                if (settings[ExternalSettingsSharedFieldName].ContainsKey(keyValuePair.Key))
                                {
                                    if (string.CompareOrdinal(settings[ExternalSettingsSharedFieldName][keyValuePair.Key], keyValuePair.Value) != 0)
                                    {
                                        this.CustomFields[keyValuePair.Key] = settings[ExternalSettingsSharedFieldName][keyValuePair.Key];
                                    }
                                }
                            }
                        }
                    }
                }
            }

            this.OriginalSettings = externalSettingsComponent.Settings;

            return(this);
        }
        }                                                       // Copy of the Settings property of the ExternalSettingsComponent (used to check for changes)

        /// <summary>
        ///     Updates the ExternalSettingsComponent from the CustomFieldsComponent
        /// </summary>
        /// <param name="externalSettingsComponent"></param>
        /// <param name="sellableItem"></param>
        /// <returns></returns>
        public CustomFieldsComponent UpdateExternalSettings(ExternalSettingsComponent externalSettingsComponent, SellableItem sellableItem)
        {
            var settingsCollection = ParseExternalSettings(externalSettingsComponent.Settings);

            string[] allParents = GetAllParents(sellableItem);

            var newValues = this.CustomFields;

            var languages = new List <string>();

            languages.Add(ExternalSettingsSharedFieldName);

            settingsCollection = settingsCollection.UpdateSettings(sellableItem.SitecoreId, allParents, languages.ToArray(), this.CustomFields);

            var serializedSettings = JsonConvert.SerializeObject(settingsCollection);

            externalSettingsComponent.Settings = serializedSettings;

            OriginalSettings = serializedSettings;

            return(this);
        }
        private Dictionary <Guid, Dictionary <string, Dictionary <string, string> > > GetExternalSettings(ExternalSettingsComponent externalSettings)
        {
            var settingsCollection = new Dictionary <Guid, Dictionary <string, Dictionary <string, string> > >();

            if (!string.IsNullOrEmpty(externalSettings.Settings))
            {
                try
                {
                    settingsCollection = JsonConvert.DeserializeObject <Dictionary <Guid, Dictionary <string, Dictionary <string, string> > > >(externalSettings.Settings);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }

            return(settingsCollection);
        }