///|
async fn run_pseudo(args : Array[String]) -> Unit raise CliError {
  let values : Array[String] = [args[0]]
  let mut message_profile = ""
  let mut profile_seen = false
  let mut cursor = 1
  while cursor < args.length() {
    if args[cursor] == "--message-profile" {
      if profile_seen || cursor + 1 >= args.length() {
        cli_fail(usage())
      }
      message_profile = args[cursor + 1]
      profile_seen = true
      cursor = cursor + 2
    } else {
      values.push(args[cursor])
      cursor = cursor + 1
    }
  }
  if !profile_seen ||
    values.length() != 6 ||
    !@runtime.is_supported_message_profile(message_profile) {
    cli_fail(usage())
  }
  match
    @generator.pseudo_locale(
      read_file_limited(values[1], @runtime.CATALOG_MAX_SOURCE_BYTES),
      values[2],
      read_file_limited(values[3], @runtime.CATALOG_MAX_SOURCE_BYTES),
      values[4],
      message_profile~,
    ) {
    Ok(value) => write_file(values[5], text_file_content(value))
    Err(message) => cli_fail(message)
  }
}

///|
async fn run_export_xliff(args : Array[String]) -> Unit raise CliError {
  let values : Array[String] = [args[0]]
  let mut state_path : String? = None
  let mut message_profile = ""
  let mut profile_seen = false
  let mut cursor = 1
  while cursor < args.length() {
    if args[cursor] == "--state" {
      if state_path is Some(_) || cursor + 1 >= args.length() {
        cli_fail(usage())
      }
      state_path = Some(args[cursor + 1])
      cursor = cursor + 2
    } else if args[cursor] == "--message-profile" {
      if profile_seen || cursor + 1 >= args.length() {
        cli_fail(usage())
      }
      message_profile = args[cursor + 1]
      profile_seen = true
      cursor = cursor + 2
    } else {
      values.push(args[cursor])
      cursor = cursor + 1
    }
  }
  if !profile_seen ||
    values.length() != 7 ||
    !@runtime.is_supported_message_profile(message_profile) {
    cli_fail(usage())
  }
  let target = if values[5] == "-" {
    None
  } else {
    Some(read_file_limited(values[5], @runtime.CATALOG_MAX_SOURCE_BYTES))
  }
  let state = match state_path {
    Some("-") | None => None
    Some(path) =>
      Some(read_file_limited(path, @generator.I18N_MAX_TOTAL_LOCALE_BYTES))
  }
  match
    @generator.export_xliff_with_state(
      read_file_limited(values[1], @runtime.CATALOG_MAX_SOURCE_BYTES),
      values[2],
      read_file_limited(values[3], @runtime.CATALOG_MAX_SOURCE_BYTES),
      values[4],
      target,
      state,
      message_profile~,
    ) {
    Ok(value) => write_file(values[6], value)
    Err(message) => cli_fail(message)
  }
}

///|
async fn run_import_xliff(args : Array[String]) -> Unit raise CliError {
  let values : Array[String] = [args[0]]
  let mut state_output : String? = None
  let mut report_output : String? = None
  let mut migrations_path : String? = None
  let mut message_profile = ""
  let mut profile_seen = false
  let mut cursor = 1
  while cursor < args.length() {
    let option = args[cursor]
    if option == "--state-output" ||
      option == "--report-output" ||
      option == "--id-migrations" ||
      option == "--message-profile" {
      if cursor + 1 >= args.length() {
        cli_fail(usage())
      }
      let value = args[cursor + 1]
      if option == "--state-output" {
        if state_output is Some(_) {
          cli_fail(usage())
        }
        state_output = Some(value)
      } else if option == "--report-output" {
        if report_output is Some(_) {
          cli_fail(usage())
        }
        report_output = Some(value)
      } else if option == "--id-migrations" {
        if migrations_path is Some(_) {
          cli_fail(usage())
        }
        migrations_path = Some(value)
      } else {
        if profile_seen {
          cli_fail(usage())
        }
        message_profile = value
        profile_seen = true
      }
      cursor = cursor + 2
    } else {
      values.push(option)
      cursor = cursor + 1
    }
  }
  if !profile_seen ||
    values.length() != 7 ||
    !@runtime.is_supported_message_profile(message_profile) {
    cli_fail(usage())
  }
  let resolved_state_output = state_output.unwrap_or(
    values[6] + ".xliff-state.json",
  )
  let resolved_report_output = report_output.unwrap_or(
    values[6] + ".xliff-report.json",
  )
  if resolved_state_output == values[6] ||
    resolved_report_output == values[6] ||
    resolved_state_output == resolved_report_output {
    cli_fail("XLIFF locale, state, and report outputs must be distinct paths")
  }
  let migrations = match migrations_path {
    Some("-") | None => None
    Some(path) =>
      Some(read_file_limited(path, @runtime.CATALOG_MAX_SOURCE_BYTES))
  }
  match
    @generator.import_xliff_with_state(
      read_file_limited(values[1], @runtime.CATALOG_MAX_SOURCE_BYTES),
      values[2],
      read_file_limited(values[3], @runtime.CATALOG_MAX_SOURCE_BYTES),
      values[4],
      read_file_limited(values[5], @generator.I18N_MAX_TOTAL_LOCALE_BYTES),
      migrations,
      message_profile~,
    ) {
    Ok(result) => {
      write_file(values[6], text_file_content(result.locale_source))
      write_file(
        resolved_state_output,
        text_file_content(result.exchange_state),
      )
      write_file(resolved_report_output, text_file_content(result.report))
    }
    Err(message) => cli_fail(message)
  }
}

///|
async fn run_import_i18next(args : Array[String]) -> Unit raise CliError {
  let values : Array[String] = [args[0]]
  let mut message_profile = ""
  let mut profile_seen = false
  let mut cursor = 1
  while cursor < args.length() {
    if args[cursor] == "--message-profile" {
      if profile_seen || cursor + 1 >= args.length() {
        cli_fail(usage())
      }
      message_profile = args[cursor + 1]
      profile_seen = true
      cursor = cursor + 2
    } else {
      values.push(args[cursor])
      cursor = cursor + 1
    }
  }
  if !profile_seen ||
    values.length() != 6 ||
    !@runtime.is_supported_message_profile(message_profile) {
    cli_fail(usage())
  }
  if values[4] == values[5] {
    cli_fail("migration locale and report outputs must be distinct paths")
  }
  match
    @generator.import_i18next_json(
      read_file_limited(values[1], @runtime.CATALOG_MAX_SOURCE_BYTES),
      values[2],
      read_file_limited(values[3], @generator.I18N_MAX_TOTAL_LOCALE_BYTES),
      message_profile~,
    ) {
    Ok(result) => {
      write_file(values[4], text_file_content(result.locale_source))
      write_file(values[5], text_file_content(result.report))
    }
    Err(message) => cli_fail(message)
  }
}

///|
async fn run_import_arb(args : Array[String]) -> Unit raise CliError {
  let values : Array[String] = [args[0]]
  let mut message_profile = ""
  let mut profile_seen = false
  let mut cursor = 1
  while cursor < args.length() {
    if args[cursor] == "--message-profile" {
      if profile_seen || cursor + 1 >= args.length() {
        cli_fail(usage())
      }
      message_profile = args[cursor + 1]
      profile_seen = true
      cursor = cursor + 2
    } else {
      values.push(args[cursor])
      cursor = cursor + 1
    }
  }
  if !profile_seen ||
    values.length() != 6 ||
    !@runtime.is_supported_message_profile(message_profile) {
    cli_fail(usage())
  }
  if values[4] == values[5] {
    cli_fail("migration locale and report outputs must be distinct paths")
  }
  match
    @generator.import_flutter_arb(
      read_file_limited(values[1], @runtime.CATALOG_MAX_SOURCE_BYTES),
      values[2],
      read_file_limited(values[3], @generator.I18N_MAX_TOTAL_LOCALE_BYTES),
      message_profile~,
    ) {
    Ok(result) => {
      write_file(values[4], text_file_content(result.locale_source))
      write_file(values[5], text_file_content(result.report))
    }
    Err(message) => cli_fail(message)
  }
}