/// <summary>
        /// Helper to retrieve the root Layout from the manifest.
        /// </summary>
        /// <param name="smartApp">A SmartAppInfo object.</param>
        /// <returns>A tuple of a LayoutInfo with his associated ConcernInfo.</returns>
        public static Tuple <LayoutInfo, ConcernInfo> GetRootLayout(this SmartAppInfo smartApp)
        {
            if (!smartApp.IsValid())
            {
                return(null);
            }

            if (smartApp.Concerns.IsValid())
            {
                foreach (var concern in smartApp.Concerns)
                {
                    if (concern.IsValid() &&
                        concern.Layouts.IsValid())
                    {
                        foreach (var layout in concern.Layouts)
                        {
                            if (layout.IsValid() &&
                                layout.IsRoot)
                            {
                                return(new Tuple <LayoutInfo, ConcernInfo>(
                                           layout,
                                           concern));
                            }
                        }
                    }
                }
            }

            return(null);
        }
        /// <summary>
        /// Retrieve layouts from the application.
        /// </summary>
        /// <param name="smartApp">A SmartAppInfo object.</param>
        /// <returns>A LayoutList.</returns>
        public static LayoutList GetLayouts(this SmartAppInfo smartApp)
        {
            var layouts = new LayoutList();

            if (!smartApp.IsValid())
            {
                return(layouts);
            }

            var layoutComparer = new LayoutInfoComparer();

            if (smartApp.Version.IsValid() &&
                smartApp.Concerns.IsValid())
            {
                var listToRetrieve = smartApp.Concerns.GetLayouts();

                layouts = layouts
                          .Union(
                    listToRetrieve,
                    layoutComparer)
                          .ToLayoutList();
            }

            return(layouts);
        }
        /// <summary>
        /// Check if there is at least one menu in the application.
        /// </summary>
        /// <param name="smartApp">A SmartAppInfo object.</param>
        /// <returns>A boolean.</returns>
        public static bool HasMenu(this SmartAppInfo smartApp)
        {
            if (!smartApp.IsValid())
            {
                return(false);
            }

            if (smartApp.Concerns.IsValid())
            {
                return(smartApp.Concerns.HasMenu());
            }

            return(false);
        }
        /// <summary>
        /// Retrieve a 3-digit version.
        /// </summary>
        /// <param name="smartApp">A SmartAppInfo object.</param>
        /// <returns>A 3-digit version in string.</returns>
        public static string GetVersion(this SmartAppInfo smartApp)
        {
            if (!smartApp.IsValid())
            {
                return(null);
            }

            if (smartApp.Version.IsValid())
            {
                return($"{smartApp.Version.Major}.{smartApp.Version.Minor}.{smartApp.Version.Release}");
            }

            return(null);
        }
        /// <summary>
        /// Retrieve used Models inside the application (Layouts and Apis parameters references models)
        /// </summary>
        /// <param name="smartApp">A SmartAppInfo object.</param>
        /// <returns>A list of EntityInfo.</returns>
        public static List <EntityInfo> GetUsedModels(this SmartAppInfo smartApp)
        {
            var usedModels      = new List <EntityInfo>();
            var specifiedModels = new List <EntityInfo>();

            if (!smartApp.IsValid())
            {
                return(usedModels);
            }

            var entityComparer = new EntityInfoComparer();

            if (smartApp.Version.IsValid() &&
                smartApp.DataModel.IsValid() &&
                smartApp.Concerns.IsValid() &&
                smartApp.Api.IsValid())
            {
                specifiedModels = specifiedModels
                                  .Union(
                    smartApp.Concerns.GetConcernListDirectReferences(),
                    entityComparer)
                                  .ToList();

                specifiedModels = specifiedModels
                                  .Union(
                    smartApp.Api.GetApiListDirectReferences(),
                    entityComparer)
                                  .ToList();

                foreach (var entity in specifiedModels)
                {
                    if (entity.IsValid())
                    {
                        usedModels = usedModels
                                     .Union(
                            entity.GetEntityIndirectReferences(),
                            entityComparer)
                                     .ToList();
                    }
                }

                usedModels = usedModels
                             .Union(
                    specifiedModels,
                    entityComparer)
                             .ToList();
            }

            return(usedModels);
        }
        /// <summary>
        /// Retrieve all entity models.
        /// </summary>
        /// <param name="smartApp">A SmartAppInfo object.</param>
        public static SchemaArray <EntityInfo> GetModels(this SmartAppInfo smartApp)
        {
            var models = new SchemaArray <EntityInfo>();

            if (!smartApp.IsValid())
            {
                return(models);
            }

            if (smartApp.DataModel.IsValid())
            {
                models = smartApp.DataModel.Entities;
            }

            return(models);
        }
        /// <summary>
        /// Retrieve used ViewModels inside the application (Apis parameters models).
        /// </summary>
        /// <param name="smartApp">A SmartAppInfo object.</param>
        /// <returns>A list of EntityInfo.</returns>
        public static List <EntityInfo> GetViewModels(this SmartAppInfo smartApp)
        {
            var usedViewModels = new List <EntityInfo>();

            if (!smartApp.IsValid())
            {
                return(usedViewModels);
            }

            var entityComparer = new EntityInfoComparer();

            if (smartApp.Version.IsValid() &&
                smartApp.Api.IsValid())
            {
                usedViewModels = usedViewModels
                                 .Union(
                    smartApp.Api.GetApiListViewModelsEntities(),
                    entityComparer)
                                 .ToList();
            }

            return(usedViewModels);
        }