///| git-bit main entry point

///|
let git_bit_version_tag : String = "0.2.0"

///|
fn git_bit_help_text() -> String {
  let text =
    #|usage: git-bit [-v | --version] [-h | --help] [-C ]
    #|                []
    #|
    #|git-bit provides Git-hosted collaboration commands without depending on bit CLI.
    #|
    #|commands
    #|   pr           Manage pull requests
    #|   issue        Manage issues
    #|   work-item    Manage combined issue / pull-request views
    #|   search       Search pull requests and issues
    #|   init         Initialize collaboration metadata
    #|   debug        Debug and inspect collaboration internals
  text
}

///|
async fn show_git_bit_help() -> Unit {
  print_line(git_bit_help_text())
}

///|
fn git_bit_apply_cwd(raw_dir : String) -> Unit {
  let resolved = if raw_dir.has_prefix("/") {
    raw_dir
  } else {
    let base = @env.get_env_var("PWD").unwrap_or(".")
    normalize_path(base + "/" + raw_dir)
  }
  @env.set_env_var("GIT_SHIM_CWD", resolved)
  @env.set_env_var("GIT_SHIM_PWD", resolved)
}

///|
async fn run_git_bit_for_args(args : Array[String]) -> Unit {
  if args.length() < 2 {
    show_git_bit_help()
    return ()
  }
  let mut i = 1
  while i < args.length() {
    match args[i] {
      "-v" | "--version" | "version" => {
        print_line("git-bit version \{git_bit_version_tag}")
        return ()
      }
      "-h" | "--help" => {
        show_git_bit_help()
        return ()
      }
      "-C" if i + 1 < args.length() => {
        git_bit_apply_cwd(args[i + 1])
        i += 2
      }
      _ if args[i].has_prefix("-") => {
        eprint_line("git-bit: unsupported global option '\{args[i]}'")
        @sys.exit(2)
      }
      _ => break
    }
  }
  if i >= args.length() {
    eprint_line("git-bit: missing subcommand")
    @sys.exit(2)
  }
  let cmd = args[i]
  let rest = collect_args(args, i + 1)
  match cmd {
    "pr" => handle_hub_pr(rest)
    "issue" => handle_hub_issue(rest)
    "work-item" => handle_hub_work_item(rest)
    "search" => handle_hub_search(rest)
    "init" => handle_hub_init(rest)
    "debug" =>
      if rest.length() > 0 && rest[0] == "dump" {
        handle_hub_dump(collect_args(rest, 1))
      } else {
        eprint_line("git-bit debug: supported subcommands: dump")
        @sys.exit(1)
      }
    "help" => show_git_bit_help()
    _ => {
      eprint_line("git-bit: unknown subcommand '\{cmd}'")
      show_git_bit_help()
      @sys.exit(1)
    }
  }
}

///|
async fn main_async() -> Unit {
  let args = @env.args()
  run_git_bit_for_args(args)
}

///|
fn main {
  @async.run_async_main(main_async)
}