public static ConfigMasterParsed CalculateListsOfEntities(ConfigMasterParsed CMP)
        {
            CMP.ListOfComponents.Clear();
            CMP.ListOfEnvironments.Clear();
            CMP.ListOfServers.Clear();

            // TODO: Populate these lists from the Recipe and Settings.
            // TODO: Indicate which problems or inconsistencies there are.

            return(CMP);
        }
        public static List <CalculatedFile> CalculateFiles(ConfigMasterParsed configMaster)
        {
            var Result = new List <CalculatedFile>();

            foreach (var item in configMaster.GlobalRecipe.ListOfRecipeConfigFiles)
            {
                var newCalcFile = new CalculatedFile()
                {
                    Component      = item.Component,
                    ComputerName   = item.ComputerName,
                    Environment    = item.Environment,
                    ConfigFilename = item.ConfigFilePath
                };

                newCalcFile.ListOfEffectiveSettings = CalculateThisFile(configMaster, newCalcFile.ConfigFilename);

                Result.Add(newCalcFile);
            }

            return(Result);
        }
        public static ConfigMasterParsed CalculateListsOfEntities(ConfigMasterParsed CMP)
        {
            CMP.ListOfComponents.Clear();
            CMP.ListOfEnvironments.Clear();
            CMP.ListOfServers.Clear();

            // TODO: Populate these lists from the Recipe and Settings.
            // TODO: Indicate which problems or inconsistencies there are.

            return CMP;
        }
        public static List<CalculatedFile> CalculateFiles(ConfigMasterParsed configMaster)
        {
            var Result = new List<CalculatedFile>();

            foreach (var item in configMaster.GlobalRecipe.ListOfRecipeConfigFiles)
            {
                var newCalcFile = new CalculatedFile()
                {
                    Component = item.Component,
                    ComputerName = item.ComputerName,
                    Environment = item.Environment,
                    ConfigFilename = item.ConfigFilePath
                };

                newCalcFile.ListOfEffectiveSettings = CalculateThisFile(configMaster, newCalcFile.ConfigFilename);

                Result.Add(newCalcFile);
            }

            return Result;
        }
        /// <summary>
        /// Loads the Master Config XML file into an ConfigMasterParsed Object
        /// </summary>
        /// <param name="ConfigMasterFilename"></param>
        /// <returns></returns>
        public static ConfigMasterParsed LoadConfigMasterFile(string ConfigMasterFilename)
        {
            var CMO = new ConfigMasterParsed();

            var XMasterFile = XDocument.Load(ConfigMasterFilename);

            //// Load registered Environments
            //foreach (var env in XMasterFile.Root.Element("Environments").Elements("Environment"))
            //{
            //    CMO.ListOfEnvironments.Add(new Models.Environment()
            //    {
            //        Title = env.Attribute("Title").Value,
            //        Description = env.Attribute("Description").Value
            //    });
            //}

            //// Load registered Servers
            //foreach (var env in XMasterFile.Root.Element("Servers").Elements("Server"))
            //{
            //    CMO.ListOfServers.Add(new Models.Computer()
            //    {
            //        ComputerName = env.Attribute("ComputerName").Value,
            //        Description = env.Attribute("Description").Value
            //    });
            //}


            //// Load registered Components
            //foreach (var env in XMasterFile.Root.Element("Components").Elements("Component"))
            //{
            //    CMO.ListOfComponents.Add(new Models.Component()
            //    {
            //        Title = env.Attribute("Title").Value,
            //        Description = env.Attribute("Description").Value
            //    });
            //}

            // Load Recipe
            CMO.GlobalRecipe = new ConfigFileInstances();

            foreach (var env in XMasterFile.Root.Element("Recipes").Elements("Environment"))
            {

                foreach (var comp in env.Elements("Component"))
                {
                    
                    foreach (var svr in comp.Elements("Server"))
                    {

                        var newSvr = new ConfigFileInstances.ConfigFileInstance()
                        {
                            Environment = env.Attribute("Title").Value,
                            Component = comp.Attribute("Title").Value,
                            ComputerName = svr.Attribute("ComputerName").Value,
                            ConfigFilePath = svr.Attribute("ConfigFilePath").Value
                        };

                        CMO.GlobalRecipe.ListOfRecipeConfigFiles.Add(newSvr);
                        
                    }
                     
                }
 
            }

            // Load Settings
            CMO.GlobalSettings = new Settings();
            foreach (var sett in XMasterFile.Root.Element("Settings").Elements("Setting"))
            {
                var newSetting = new Settings.Setting();
                newSetting.Name = sett.Attribute("Name").Value;
                newSetting.Key = sett.Attribute("Key").Value;
                newSetting.GlobalDefaultValue = sett.Attribute("GlobalDefaultValue").Value;

                foreach (var applicComp in sett.Element("ApplicableComponents").Elements("Component"))
                {
                    newSetting.ListOfApplicableComponents.Add(applicComp.Attribute("Title").Value);
                }

                foreach (var overrideSetting in sett.Elements("Override"))
                {
                    var overridSet = new Settings.Setting.Overrides()
                    {
                        OverrideValue = overrideSetting.Attribute("OverrideValue").Value,
                        Component = overrideSetting?.Element("Component")?.Attribute("Title")?.Value,
                        Environment = overrideSetting?.Element("Environment")?.Attribute("Title")?.Value,
                        Server = overrideSetting?.Element("Server")?.Attribute("ComputerName")?.Value,
                    };

                    newSetting.ListOfOverrides.Add(overridSet);
                }

                CMO.GlobalSettings.ListOfSettings.Add(newSetting);
            }


            return CMO;
        }
        public static List<Settings.EffectiveSetting> CalculateThisFile(ConfigMasterParsed configMaster, string configFilename)
        {
            var Result = new List<Settings.EffectiveSetting>();

            var configFileInfo = configMaster.GlobalRecipe.ListOfRecipeConfigFiles.FirstOrDefault(q => q.ConfigFilePath == configFilename);
            if (configFileInfo != null)
            {
                var CurrentEnvironment = configFileInfo.Environment;
                var CurrentServer = configFileInfo.ComputerName;
                var CurrentComponent = configFileInfo.Component;

                var ApplicableSettings = configMaster.GlobalSettings.ListOfSettings.Where(q => q.ListOfApplicableComponents.Contains(CurrentComponent));

                foreach (var sett in ApplicableSettings)
                {
                    var newSetting = new Settings.EffectiveSetting()
                    {
                        Key = sett.Key,
                        Name = sett.Name,
                        DesiredValue = sett.GlobalDefaultValue
                    };

                    // See if we should override the value
                    var ComponentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component?.ToLower() == CurrentComponent?.ToLower() && y.Environment == null && y.Server == null);
                    if (ComponentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ComponentOverriders?.OverrideValue;
                    }


                    var EnvironmentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component == null && y.Environment?.ToLower() == CurrentEnvironment?.ToLower() && y.Server == null);
                    if (EnvironmentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = EnvironmentOverriders?.OverrideValue;
                    }


                    var ServerOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component == null && y.Environment == null && y.Server?.ToLower() == CurrentServer?.ToLower());
                    if (ServerOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ServerOverriders?.OverrideValue;
                    }


                    // More specific: Component and Environment
                    var ComponentEnvironmentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component?.ToLower() == CurrentComponent?.ToLower() && y.Environment?.ToLower() == CurrentEnvironment?.ToLower() && y.Server == null);
                    if (ComponentEnvironmentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ComponentEnvironmentOverriders?.OverrideValue;
                    }


                    var ServerEnvironmentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component == null && y.Environment?.ToLower() == CurrentEnvironment?.ToLower() && y.Server?.ToLower() == CurrentServer?.ToLower());
                    if (ServerEnvironmentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ServerEnvironmentOverriders?.OverrideValue;
                    }


                    var ServerComponentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component?.ToLower() == CurrentComponent?.ToLower() && y.Environment == null && y.Server?.ToLower() == CurrentServer?.ToLower());
                    if (ServerComponentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ServerComponentOverriders?.OverrideValue;
                    }


                    // Most Specific:  Component and Environment and Server
                    var EnvironmentServerComponentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component?.ToLower() == CurrentComponent?.ToLower() && y.Environment?.ToLower() == CurrentEnvironment?.ToLower() && y.Server?.ToLower() == CurrentServer?.ToLower());
                    if (EnvironmentServerComponentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = EnvironmentServerComponentOverriders?.OverrideValue;
                    }


                    Result.Add(newSetting);
                }
            }

            return Result;
        }
        /// <summary>
        /// Loads the Master Config XML file into an ConfigMasterParsed Object
        /// </summary>
        /// <param name="ConfigMasterFilename"></param>
        /// <returns></returns>
        public static ConfigMasterParsed LoadConfigMasterFile(string ConfigMasterFilename)
        {
            var CMO = new ConfigMasterParsed();

            var XMasterFile = XDocument.Load(ConfigMasterFilename);

            //// Load registered Environments
            //foreach (var env in XMasterFile.Root.Element("Environments").Elements("Environment"))
            //{
            //    CMO.ListOfEnvironments.Add(new Models.Environment()
            //    {
            //        Title = env.Attribute("Title").Value,
            //        Description = env.Attribute("Description").Value
            //    });
            //}

            //// Load registered Servers
            //foreach (var env in XMasterFile.Root.Element("Servers").Elements("Server"))
            //{
            //    CMO.ListOfServers.Add(new Models.Computer()
            //    {
            //        ComputerName = env.Attribute("ComputerName").Value,
            //        Description = env.Attribute("Description").Value
            //    });
            //}


            //// Load registered Components
            //foreach (var env in XMasterFile.Root.Element("Components").Elements("Component"))
            //{
            //    CMO.ListOfComponents.Add(new Models.Component()
            //    {
            //        Title = env.Attribute("Title").Value,
            //        Description = env.Attribute("Description").Value
            //    });
            //}

            // Load Recipe
            CMO.GlobalRecipe = new ConfigFileInstances();

            foreach (var env in XMasterFile.Root.Element("Recipes").Elements("Environment"))
            {
                foreach (var comp in env.Elements("Component"))
                {
                    foreach (var svr in comp.Elements("Server"))
                    {
                        var newSvr = new ConfigFileInstances.ConfigFileInstance()
                        {
                            Environment    = env.Attribute("Title").Value,
                            Component      = comp.Attribute("Title").Value,
                            ComputerName   = svr.Attribute("ComputerName").Value,
                            ConfigFilePath = svr.Attribute("ConfigFilePath").Value
                        };

                        CMO.GlobalRecipe.ListOfRecipeConfigFiles.Add(newSvr);
                    }
                }
            }

            // Load Settings
            CMO.GlobalSettings = new Settings();
            foreach (var sett in XMasterFile.Root.Element("Settings").Elements("Setting"))
            {
                var newSetting = new Settings.Setting();
                newSetting.Name = sett.Attribute("Name").Value;
                newSetting.Key  = sett.Attribute("Key").Value;
                newSetting.GlobalDefaultValue = sett.Attribute("GlobalDefaultValue").Value;

                foreach (var applicComp in sett.Element("ApplicableComponents").Elements("Component"))
                {
                    newSetting.ListOfApplicableComponents.Add(applicComp.Attribute("Title").Value);
                }

                foreach (var overrideSetting in sett.Elements("Override"))
                {
                    var overridSet = new Settings.Setting.Overrides()
                    {
                        OverrideValue = overrideSetting.Attribute("OverrideValue").Value,
                        Component     = overrideSetting?.Element("Component")?.Attribute("Title")?.Value,
                        Environment   = overrideSetting?.Element("Environment")?.Attribute("Title")?.Value,
                        Server        = overrideSetting?.Element("Server")?.Attribute("ComputerName")?.Value,
                    };

                    newSetting.ListOfOverrides.Add(overridSet);
                }

                CMO.GlobalSettings.ListOfSettings.Add(newSetting);
            }


            return(CMO);
        }
        public static List <Settings.EffectiveSetting> CalculateThisFile(ConfigMasterParsed configMaster, string configFilename)
        {
            var Result = new List <Settings.EffectiveSetting>();

            var configFileInfo = configMaster.GlobalRecipe.ListOfRecipeConfigFiles.FirstOrDefault(q => q.ConfigFilePath == configFilename);

            if (configFileInfo != null)
            {
                var CurrentEnvironment = configFileInfo.Environment;
                var CurrentServer      = configFileInfo.ComputerName;
                var CurrentComponent   = configFileInfo.Component;

                var ApplicableSettings = configMaster.GlobalSettings.ListOfSettings.Where(q => q.ListOfApplicableComponents.Contains(CurrentComponent));

                foreach (var sett in ApplicableSettings)
                {
                    var newSetting = new Settings.EffectiveSetting()
                    {
                        Key          = sett.Key,
                        Name         = sett.Name,
                        DesiredValue = sett.GlobalDefaultValue
                    };

                    // See if we should override the value
                    var ComponentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component?.ToLower() == CurrentComponent?.ToLower() && y.Environment == null && y.Server == null);
                    if (ComponentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ComponentOverriders?.OverrideValue;
                    }


                    var EnvironmentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component == null && y.Environment?.ToLower() == CurrentEnvironment?.ToLower() && y.Server == null);
                    if (EnvironmentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = EnvironmentOverriders?.OverrideValue;
                    }


                    var ServerOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component == null && y.Environment == null && y.Server?.ToLower() == CurrentServer?.ToLower());
                    if (ServerOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ServerOverriders?.OverrideValue;
                    }


                    // More specific: Component and Environment
                    var ComponentEnvironmentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component?.ToLower() == CurrentComponent?.ToLower() && y.Environment?.ToLower() == CurrentEnvironment?.ToLower() && y.Server == null);
                    if (ComponentEnvironmentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ComponentEnvironmentOverriders?.OverrideValue;
                    }


                    var ServerEnvironmentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component == null && y.Environment?.ToLower() == CurrentEnvironment?.ToLower() && y.Server?.ToLower() == CurrentServer?.ToLower());
                    if (ServerEnvironmentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ServerEnvironmentOverriders?.OverrideValue;
                    }


                    var ServerComponentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component?.ToLower() == CurrentComponent?.ToLower() && y.Environment == null && y.Server?.ToLower() == CurrentServer?.ToLower());
                    if (ServerComponentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = ServerComponentOverriders?.OverrideValue;
                    }


                    // Most Specific:  Component and Environment and Server
                    var EnvironmentServerComponentOverriders = sett.ListOfOverrides.FirstOrDefault(y => y.Component?.ToLower() == CurrentComponent?.ToLower() && y.Environment?.ToLower() == CurrentEnvironment?.ToLower() && y.Server?.ToLower() == CurrentServer?.ToLower());
                    if (EnvironmentServerComponentOverriders?.OverrideValue != null)
                    {
                        newSetting.DesiredValue = EnvironmentServerComponentOverriders?.OverrideValue;
                    }


                    Result.Add(newSetting);
                }
            }

            return(Result);
        }