private static string GenerateModelClass(CodeGenerationOptions options, Kind kind)
        {
            Clear();
            string ns = NamespaceHelper.MakeNamespace(options.RootNamespace, kind);

            WriteUsings(options, kind);
            WriteLine($"namespace {ns}");
            using (OpenBlock())
            {
                string typeName = NameHelper.MakeModelClassName(kind);

                WriteLine($"public class {typeName}");
                using (OpenBlock())
                {
                    if (kind == Kind.Context || kind == Kind.Supervisor)
                    {
                        WriteLine($"public ScaffoldedFile File {{ get; set; }}");
                        WriteLine();
                        WriteLine($"public ScaffoldedFile Interface {{ get; set; }}");
                    }
                    else
                    {
                        WriteLine($"public IList<ScaffoldedFile> Files {{ get; }} = new List<ScaffoldedFile>();");
                    }
                }
            }
            return(GetText());
        }
        private static string GenerateScaffolderInterface(CodeGenerationOptions options, Kind kind)
        {
            Clear();
            string ns = NamespaceHelper.MakeNamespace(options.RootNamespace, kind);

            WriteUsings(options, kind);
            WriteLine($"namespace {ns}");
            using (OpenBlock())
            {
                string modelName = NameHelper.MakeModelClassName(kind);
                string typeName  = NameHelper.MakeScaffolderInterfaceName(kind);

                WriteLine($"public interface {typeName}");
                using (OpenBlock())
                {
                    WriteLine($"void Save({modelName} model);");
                    WriteLine();
                    WriteLine($"{modelName} ScaffoldModel(OpenApiOptions options);");
                }
            }
            return(GetText());
        }
        private static string MakeFileName(FileType type, Kind kind)
        {
            switch (type)
            {
            case FileType.ModelClass:
                return(NameHelper.MakeModelClassName(kind) + ".cs");

            case FileType.GeneratorClass:
                return(NameHelper.MakeGeneratorClassName(kind) + ".cs");

            case FileType.ScaffolderClass:
                return(NameHelper.MakeScaffolderClassName(kind) + ".cs");

            case FileType.GeneratorInterface:
                return(NameHelper.MakeGeneratorInterfaceName(kind) + ".cs");

            case FileType.ScaffolderInterface:
                return(NameHelper.MakeScaffolderInterfaceName(kind) + ".cs");

            default:
                return(string.Empty + ".cs");
            }
        }
        private static string GenerateScaffoldedModelClass(CodeGenerationOptions options)
        {
            Clear();
            WriteUsings(options, Kind.None);
            WriteLine($"namespace {options.RootNamespace}");
            using (OpenBlock())
            {
                WriteLine("public class ScaffoldedModel");
                using (OpenBlock())
                {
                    foreach (var kind in options.Kinds)
                    {
                        //if (kind == Kind.Supervisor || kind == Kind.Context)
                        //    continue;

                        string modelName = NameHelper.MakeModelClassName(kind);
                        string name      = NameHelper.MakeName(kind);
                        WriteLine();
                        WriteLine($"public {modelName} {name} {{ get; set; }}");
                    }
                }
            }
            return(GetText());
        }
        private static string GenerateScaffolderClass(CodeGenerationOptions options, Kind kind)
        {
            Clear();
            string ns = NamespaceHelper.MakeNamespace(options.RootNamespace, kind);

            WriteUsings(options, kind);
            WriteLine($"namespace {ns}");
            using (OpenBlock())
            {
                string modelName              = NameHelper.MakeModelClassName(kind);
                string typeName               = NameHelper.MakeScaffolderClassName(kind);
                string baseTypeName           = NameHelper.MakeScaffolderInterfaceName(kind);
                string generatorInterfaceName = NameHelper.MakeGeneratorInterfaceName(kind);

                WriteLine($"public class {typeName} : AbstractScaffolder, {baseTypeName}");
                using (OpenBlock())
                {
                    WriteLine($"public {typeName}(ScaffolderDependencies dependencies, {generatorInterfaceName} generator) : base(dependencies)");
                    using (OpenBlock())
                    {
                        WriteLine("Generator = generator;");
                    }

                    WriteLine();
                    WriteLine($"protected {generatorInterfaceName} Generator {{ get; }} ");

                    WriteLine();
                    WriteLine($"public void Save({modelName} model)");
                    using (OpenBlock())
                    {
                        if (kind == Kind.Context || kind == Kind.Supervisor)
                        {
                            WriteLine($"Dependencies.FileWriter.WriteFile(model.File);");
                            WriteLine($"Dependencies.FileWriter.WriteFile(model.Interface);");
                        }
                        else
                        {
                            WriteLine($"Dependencies.FileWriter.WriteFiles(model.Files);");
                        }
                    }
                    WriteLine();
                    WriteLine($"public {modelName} ScaffoldModel(OpenApiOptions options)");
                    using (OpenBlock())
                    {
                        WriteLine($"var model = new {modelName}();");

                        if (kind == Kind.Context)
                        {
                            WriteLine("var classFile = new ScaffoldedFile();");
                            WriteLine("var interfaceFile = new ScaffoldedFile();");
                            WriteLine("classFile.Code = Generator.WriteClassCode(options.Document, options.RootNamespace);");
                            WriteLine($"classFile.Path = Dependencies.PathHelper.Context(options.OutputDir, options.ContextClassName);");
                            WriteLine("interfaceFile.Code = Generator.WriteInterfaceCode(options.Document, options.RootNamespace);");
                            WriteLine($"interfaceFile.Path = Dependencies.PathHelper.Context(options.OutputDir, options.ContextInterfaceName);");
                            WriteLine("model.File = classFile;");
                            WriteLine("model.Interface = interfaceFile;");
                        }
                        else if (kind == Kind.Supervisor)
                        {
                            WriteLine("var classFile = new ScaffoldedFile();");
                            WriteLine("var interfaceFile = new ScaffoldedFile();");
                            WriteLine("classFile.Code = Generator.WriteClassCode(options.Document, options.RootNamespace);");
                            WriteLine($"classFile.Path = Dependencies.PathHelper.Supervisor(options.OutputDir, options.SupervisorClassName);");
                            WriteLine("interfaceFile.Code = Generator.WriteInterfaceCode(options.Document, options.RootNamespace);");
                            WriteLine($"interfaceFile.Path = Dependencies.PathHelper.Supervisor(options.OutputDir, options.SupervisorInterfaceName);");
                            WriteLine("model.File = classFile;");
                            WriteLine("model.Interface = interfaceFile;");
                        }
                        else
                        {
                            WriteLine("foreach(var kvp in options.Document.Components.Schemas)");
                            using (OpenBlock())
                            {
                                WriteLine("var name = kvp.Key;");
                                WriteLine("var schema = kvp.Value;");
                                WriteLine($"var code = Generator.WriteCode(schema, name, Dependencies.Namespace.{kind}(options.RootNamespace));");
                                WriteLine($"var path = Dependencies.PathHelper.{kind}(options.OutputDir, name);");
                                WriteLine($"var file = new ScaffoldedFile {{ Code = code, Path = path }};");
                                WriteLine($"model.Files.Add(file);");
                            }
                        }

                        WriteLine("return model;");
                    }
                }
            }
            return(GetText());
        }