///|
let cargo_block_begin = "# BEGIN moonchsrc managed cargo source"

///|
let cargo_block_end = "# END moonchsrc managed cargo source"

///|
fn strip_cargo_block(content : String) -> String raise PlanError {
  let kept : Array[String] = []
  let mut inside = false
  let mut found = false
  for line in content.split("\n") {
    let owned = line.to_owned()
    let trimmed = line.trim(chars=" \t\r")
    if trimmed == cargo_block_begin {
      if inside || found {
        raise ConfigConflict(
          path="Cargo config.toml",
          detail="duplicate or nested MoonChsrc managed block",
        )
      }
      inside = true
      found = true
    } else if trimmed == cargo_block_end {
      if !inside {
        raise ConfigConflict(
          path="Cargo config.toml",
          detail="managed block end marker has no matching begin marker",
        )
      }
      inside = false
    } else if !inside {
      kept.push(owned)
    }
  }
  if inside {
    raise ConfigConflict(
      path="Cargo config.toml",
      detail="managed block begin marker has no matching end marker",
    )
  }
  kept.iter().join("\n")
}

///|
fn has_unmanaged_cargo_source(content : String) -> Bool {
  content
  .split("\n")
  .any(line => {
    let trimmed = line.trim(chars=" \t\r")
    trimmed == "[source.crates-io]" || trimmed == "[source.moonchsrc]"
  })
}

///|
/// Add or replace MoonChsrc's isolated Cargo source block. Existing Cargo
/// source tables outside the managed block are rejected instead of overwritten.
pub fn set_cargo_mirror_config(
  content : String,
  registry_url : String,
) -> String raise PlanError {
  if registry_url.contains("\"") ||
    registry_url.contains("\n") ||
    registry_url.contains("\r") {
    raise UnsafeConfigValue(registry_url)
  }
  let base = strip_cargo_block(content)
  if has_unmanaged_cargo_source(base) {
    raise ConfigConflict(
      path="Cargo config.toml",
      detail="existing source.crates-io or source.moonchsrc table is not managed by MoonChsrc",
    )
  }
  let separator = if base == "" || base.has_suffix("\n") { "" } else { "\n" }
  base +
  separator +
  (
    #|# BEGIN moonchsrc managed cargo source
    #|[source.crates-io]
    #|replace-with = "moonchsrc"
    #|
    #|[source.moonchsrc]
    #|registry = "
  ) +
  registry_url +
  (
    #|"
    #|# END moonchsrc managed cargo source
    #|
  )
}

///|
/// Remove only the block owned by MoonChsrc.
pub fn reset_cargo_mirror_config(content : String) -> String raise PlanError {
  strip_cargo_block(content)
}

///|
/// Read the registry URL from MoonChsrc's managed block. Unmanaged Cargo
/// configuration is intentionally not interpreted as one of our mirrors.
pub fn get_cargo_mirror_config(content : String) -> String? raise PlanError {
  let mut inside = false
  let mut found = false
  let mut registry = None
  for line in content.split("\n") {
    let trimmed = line.trim(chars=" \t\r")
    if trimmed == cargo_block_begin {
      if inside || found {
        raise ConfigConflict(
          path="Cargo config.toml",
          detail="duplicate or nested MoonChsrc managed block",
        )
      }
      inside = true
      found = true
    } else if trimmed == cargo_block_end {
      if !inside {
        raise ConfigConflict(
          path="Cargo config.toml",
          detail="managed block end marker has no matching begin marker",
        )
      }
      inside = false
    } else if inside {
      match trimmed.strip_prefix("registry = \"") {
        Some(rest) =>
          match rest.strip_suffix("\"") {
            Some(url) => registry = Some(url.to_owned())
            None => ()
          }
        None => ()
      }
    }
  }
  if inside {
    raise ConfigConflict(
      path="Cargo config.toml",
      detail="managed block begin marker has no matching end marker",
    )
  }
  registry
}