///|
fn release_manifest_json() -> String {
  let manifest =
    #|{
    #|  "name": "developer-release-pack",
    #|  "partials": {
    #|    "feature_list": "{{#features}}- {{title}}: {{summary}}\n{{/features}}",
    #|    "upgrade_steps": "{{#upgrade_steps}}{{index}}. {{text}}\n{{/upgrade_steps}}"
    #|  },
    #|  "profiles": {
    #|    "stable": {
    #|      "context": {
    #|        "channel": "stable",
    #|        "install_tag": "latest"
    #|      }
    #|    },
    #|    "preview": {
    #|      "context": {
    #|        "channel": "preview",
    #|        "install_tag": "next"
    #|      }
    #|    }
    #|  },
    #|  "files": [
    #|    {
    #|      "path": "release/{{package.slug}}/github-release.md",
    #|      "template": "# {{package.name}} {{package.version}}\n\nChannel: {{channel}}\n\n## Highlights\n{{> feature_list}}"
    #|    },
    #|    {
    #|      "path": "release/{{package.slug}}/install.md",
    #|      "template": "## Install\n\n`moon add {{package.owner}}/{{package.slug}}@{{install_tag}}`\n\n## Upgrade notes\n{{> upgrade_steps}}"
    #|    },
    #|    {
    #|      "path": "release/{{package.slug}}/migration.txt",
    #|      "template": "Package={{package.name}}\nVersion={{package.version}}\nChannel={{channel}}\nBreaking changes={{breaking_changes}}\n"
    #|    }
    #|  ]
    #|}
  manifest
}

///|
fn release_context() -> @src.Value {
  @src.Value::object({
    "package": @src.Value::object({
      "name": @src.Value::string("moon-mustache"),
      "slug": @src.Value::string("moon-mustache"),
      "owner": @src.Value::string("bellesz0611"),
      "version": @src.Value::string("0.1.0"),
    }),
    "breaking_changes": @src.Value::string("none"),
    "features": @src.Value::array([
      @src.Value::object({
        "title": @src.Value::string("Prepared rendering"),
        "summary": @src.Value::string("compile-once / render-many entrypoints"),
      }),
      @src.Value::object({
        "title": @src.Value::string("Bundle reports"),
        "summary": @src.Value::string("validation and plan reporting for CI"),
      }),
      @src.Value::object({
        "title": @src.Value::string("Official fixture parity"),
        "summary": @src.Value::string("136 imported spec fixtures passing"),
      }),
    ]),
    "upgrade_steps": @src.Value::array([
      @src.Value::object({
        "index": @src.Value::number(1.0),
        "text": @src.Value::string("update the dependency version in moon.mod"),
      }),
      @src.Value::object({
        "index": @src.Value::number(2.0),
        "text": @src.Value::string(
          "rerun project formatting, info, check, and test gates",
        ),
      }),
      @src.Value::object({
        "index": @src.Value::number(3.0),
        "text": @src.Value::string(
          "review the benchmark and compatibility reports",
        ),
      }),
    ]),
  })
}

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

///|
fn main {
  let manifest = @src.parse_bundle_manifest_json(release_manifest_json()).unwrap()
  let validation = @src.validate_bundle_manifest(manifest)
  let prepared = @src.prepare_bundle_manifest_profile(
    manifest,
    release_context(),
    profile_name="stable",
  ).unwrap()
  let result = @src.render_prepared_bundle_manifest_checked(
    prepared,
    @src.RenderOptions::strict(),
  )
  let plan = @src.build_bundle_plan(
    "developer-release-pack", result, validation,
  )

  println(
    @src.format_validation_report_markdown("developer-release-pack", validation),
  )
  println("")
  println(@src.format_bundle_plan_markdown(plan))
  println("")

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