public static void GenerateStaticCollectionScript(ScriptableObjectCollection collection)
        {
            string fileName = $"{collection.GetCollectionType().Name}Static";
            bool   isGeneratingCustomStaticFile = ScriptableObjectCollectionSettings.Instance.IsGeneratingCustomStaticFile(collection);

            if (isGeneratingCustomStaticFile)
            {
                fileName = ScriptableObjectCollectionSettings.Instance.GetGeneratedStaticFileName(collection);
            }

            string nameSpace   = collection.GetCollectionType().Namespace;
            string finalFolder = ScriptableObjectCollectionSettings.Instance.GetStaticFileFolderForCollection(collection);

            if (string.IsNullOrEmpty(finalFolder))
            {
                Debug.LogError("Static Code Generation folder not assigned, please assign it on the ScriptableObjectCollectionSettings");
                EditorGUIUtility.PingObject(ScriptableObjectCollectionSettings.Instance);
                Selection.objects = new Object[] { ScriptableObjectCollectionSettings.Instance };
                return;
            }

            AssetDatabaseUtils.CreatePathIfDontExist(finalFolder);
            using (StreamWriter writer = new StreamWriter(Path.Combine(finalFolder, $"{fileName}.cs")))
            {
                int indentation = 0;

                List <string> directives = new List <string>();
                directives.Add(typeof(CollectionsRegistry).Namespace);
                directives.Add(collection.GetType().Namespace);
                directives.AddRange(GetCollectionDirectives(collection));

                if (!isGeneratingCustomStaticFile)
                {
                    AppendHeader(writer, ref indentation, nameSpace, "",
                                 collection.GetCollectionType().Name, true, false, directives.Distinct().ToArray());
                }
                else
                {
                    AppendHeader(writer, ref indentation, nameSpace, "",
                                 fileName, false, false, directives.Distinct().ToArray());
                }

                GeneratedStaticFileType staticFileTypeForCollection = ScriptableObjectCollectionSettings.Instance.GetStaticFileTypeForCollection(collection);
                if (staticFileTypeForCollection == GeneratedStaticFileType.DirectAccess)
                {
                    WriteDirectAccessCollectionStatic(collection, writer, ref indentation);
                }
                else
                {
                    WriteTryGetAccessCollectionStatic(collection, writer, ref indentation);
                }

                indentation--;
                AppendFooter(writer, ref indentation, nameSpace);
            }

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
        private void DrawSettings(ScriptableObjectCollection collection)
        {
            using (new GUILayout.VerticalScope("Box"))
            {
                EditorGUI.indentLevel++;
                showSettings = EditorGUILayout.Foldout(showSettings, "Settings", true);
                EditorGUI.indentLevel--;

                if (showSettings)
                {
                    EditorGUI.indentLevel++;

                    using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
                    {
                        bool isAutomaticallyLoaded = EditorGUILayout.ToggleLeft("Automatically Loaded",
                                                                                ScriptableObjectCollectionSettings.Instance.IsCollectionAutomaticallyLoaded(
                                                                                    collection));

                        if (changeCheck.changed)
                        {
                            ScriptableObjectCollectionSettings.Instance.SetCollectionAutomaticallyLoaded(
                                collection,
                                isAutomaticallyLoaded);
                        }
                    }

                    using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
                    {
                        GeneratedStaticFileType staticCodeGeneratorType =
                            (GeneratedStaticFileType)EditorGUILayout.EnumPopup("Static File Generator Type",
                                                                               ScriptableObjectCollectionSettings.Instance.GetStaticFileTypeForCollection(
                                                                                   collection));

                        if (changeCheck.changed)
                        {
                            ScriptableObjectCollectionSettings.Instance.SetStaticFileGeneratorTypeForCollection(
                                collection,
                                staticCodeGeneratorType);
                        }
                    }

                    bool overwriteStaticFileLocation = false;
                    using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
                    {
                        overwriteStaticFileLocation = EditorGUILayout.ToggleLeft(
                            "Overwrite Static File Location",
                            ScriptableObjectCollectionSettings.Instance.IsOverridingStaticFileLocation(collection));
                        if (changeCheck.changed)
                        {
                            ScriptableObjectCollectionSettings.Instance.SetOverridingStaticFileLocation(
                                collection, overwriteStaticFileLocation);
                        }
                    }

                    if (overwriteStaticFileLocation)
                    {
                        DefaultAsset targetFolder = AssetDatabase.LoadAssetAtPath <DefaultAsset>(
                            ScriptableObjectCollectionSettings.Instance.GetStaticFileFolderForCollection(
                                collection));
                        using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
                        {
                            targetFolder = (DefaultAsset)EditorGUILayout.ObjectField("Target Folder",
                                                                                     targetFolder,
                                                                                     typeof(DefaultAsset), false);

                            if (changeCheck.changed)
                            {
                                ScriptableObjectCollectionSettings.Instance.SetStaticFileFolderForCollection(
                                    collection,
                                    AssetDatabase.GetAssetPath(targetFolder));
                            }
                        }
                    }

                    EditorGUI.indentLevel--;
                }
            }
        }
        public void SetStaticFileGeneratorTypeForCollection(ScriptableObjectCollection targetCollection, GeneratedStaticFileType staticCodeGeneratorType)
        {
            CollectionToSettings settings = GetOrCreateSettingsForCollection(targetCollection);

            settings.generatedStaticFileGeneratorType = staticCodeGeneratorType;
            ObjectUtility.SetDirty(this);
        }