///|
fn starter_manifest_json() -> String {
  let manifest =
    #|{
    #|  "name": "starter-repo-kit",
    #|  "partials": {
    #|    "badges": "[![CI](https://img.shields.io/badge/ci-ready-brightgreen)](#)\n[![MoonBit](https://img.shields.io/badge/moonbit-0.10.3-blue)](#)\n",
    #|    "footer": "\nGenerated by a starter repository pipeline powered by moon-mustache.\n"
    #|  },
    #|  "profiles": {
    #|    "template": {
    #|      "context": {
    #|        "project": {
    #|          "visibility": "template"
    #|        }
    #|      }
    #|    },
    #|    "app": {
    #|      "context": {
    #|        "project": {
    #|          "visibility": "application"
    #|        }
    #|      }
    #|    }
    #|  },
    #|  "files": [
    #|    {
    #|      "path": "starter/{{project.slug}}/README.md",
    #|      "template": "# {{project.name}}\n\n{{> badges}}\nA generated MoonBit starter repository for {{project.visibility}} workflows.\n\n## Modules\n{{#modules}}- {{.}}\n{{/modules}}{{> footer}}"
    #|    },
    #|    {
    #|      "path": "starter/{{project.slug}}/moon.mod",
    #|      "template": "name = \"{{project.owner}}/{{project.slug}}\"\n\nversion = \"0.1.0\"\n\nreadme = \"README.md\"\n\nrepository = \"{{project.repository}}\"\n\nlicense = \"MIT\"\n"
    #|    },
    #|    {
    #|      "path": "starter/{{project.slug}}/.gitignore",
    #|      "template": ".mooncakes/\n_build/\nnode_modules/\n"
    #|    },
    #|    {
    #|      "path": "starter/{{project.slug}}/src/main.mbt",
    #|      "template": "fn main {\n  println(\"{{project.name}} is ready\")\n}\n"
    #|    }
    #|  ]
    #|}
  manifest
}

///|
fn starter_context() -> @src.Value {
  @src.Value::object({
    "project": @src.Value::object({
      "name": @src.Value::string("moon-starter-kit"),
      "slug": @src.Value::string("moon-starter-kit"),
      "owner": @src.Value::string("moonbit-community"),
      "repository": @src.Value::string(
        "https://github.com/moonbit-community/moon-starter-kit",
      ),
    }),
    "modules": @src.Value::array([
      @src.Value::string("CLI"),
      @src.Value::string("CI workflow"),
      @src.Value::string("Formatting and test gates"),
    ]),
  })
}

///|
fn print_file(path : String, output : String) -> Unit {
  println("== " + path + " ==")
  println(output)
  println("")
}

///|
fn main {
  let manifest = @src.parse_bundle_manifest_json(starter_manifest_json()).unwrap()
  let validation = @src.validate_bundle_manifest(manifest)
  let prepared = @src.prepare_bundle_manifest_profile(
    manifest,
    starter_context(),
    profile_name="template",
  ).unwrap()
  let result = @src.render_prepared_bundle_manifest_checked(
    prepared,
    @src.RenderOptions::strict(),
  )
  let plan = @src.build_bundle_plan("starter-repo-kit", result, validation)

  println(
    @src.format_validation_report_markdown("starter-repo-kit", validation),
  )
  println("")
  println(@src.format_bundle_plan_markdown(plan))
  println("")

  for file in result.files {
    print_file(file.path, file.output)
  }
}