/// <summary>
        /// Gets the list of compatible templates
        /// </summary>
        /// <param name="configuration">
        /// The configuration to check
        /// </param>
        /// <param name="context">
        /// The configuration data context
        /// </param>
        /// <returns>
        /// The list of compatible templates
        /// </returns>
        public static IEnumerable <CompatibleTemplate> GetCompatibleTemplates(
            this Configuration configuration,
            ConfigurationContext context)
        {
            if (configuration?.Settings?.NodeTemplates == null)
            {
                yield break;
            }

            var currentConfiguration =
                context.Configurations.Include(nameof(Configuration.CompatibleTemplatesBackward))
                .FirstOrDefault(r => r.State == EnConfigurationState.Active);

            if (currentConfiguration?.Settings?.NodeTemplates == null)
            {
                yield break;
            }

            foreach (var template in currentConfiguration.Settings.NodeTemplates)
            {
                var currentTemplate = configuration.Settings.NodeTemplates.FirstOrDefault(t => t.Code == template.Code);
                if (currentTemplate == null)
                {
                    continue;
                }

                if (currentTemplate.Configuration != template.Configuration)
                {
                    continue;
                }

                var oldRequirements = string.Join(
                    "; ",
                    template.PackageRequirements.OrderBy(p => p.Id).Select(p => $"{p.Id} {p.SpecificVersion}"));
                var newRequirements = string.Join(
                    "; ",
                    template.PackageRequirements.OrderBy(p => p.Id).Select(p => $"{p.Id} {p.SpecificVersion}"));

                if (oldRequirements != newRequirements)
                {
                    continue;
                }

                var needPackageUpdate = false;
                foreach (var requirement in currentTemplate.PackageRequirements.Where(r => r.SpecificVersion == null))
                {
                    var oldVersion = configuration.Settings.Packages.FirstOrDefault(p => p.Id == requirement.Id);
                    var newVersion = currentConfiguration.Settings.Packages.FirstOrDefault(p => p.Id == requirement.Id);
                    if (newVersion == null || oldVersion?.Version != newVersion.Version)
                    {
                        needPackageUpdate = true;
                        break;
                    }
                }

                if (needPackageUpdate)
                {
                    continue;
                }

                yield return
                    (new CompatibleTemplate
                {
                    CompatibleConfigurationId = currentConfiguration.Id,
                    ConfigurationId = configuration.Id,
                    TemplateCode = template.Code
                });

                foreach (
                    var compatible in currentConfiguration.CompatibleTemplatesBackward.Where(ct => ct.TemplateCode == template.Code))
                {
                    yield return
                        (new CompatibleTemplate
                    {
                        CompatibleConfigurationId = compatible.CompatibleConfigurationId,
                        ConfigurationId = configuration.Id,
                        TemplateCode = template.Code
                    });
                }
            }
        }