#!/usr/bin/env bash
set -euo pipefail

__radp_bf_usage() {
  cat <<'USAGE'
radp-bash-framework
Usage:
  radp-bf [command] [options...]

Commands:
  new <name>          Create a new CLI project based on radp-bash-framework.
  path [name]         Print framework paths.
                        init       Path to init.sh (framework initializer).
                        launcher   Path to launcher.sh (app launcher).
                        root       Framework root directory.
                        (no args)  Print all paths.
  -h, --help          Show this help.
  --version           Show version number.

Examples:
  source "$(radp-bf path init)"
  source "$(radp-bf path launcher)" "$@"
  radp-bf new my-cli
USAGE
}

__radp_bf_bin_dir() {
  local src="${BASH_SOURCE[0]}"

  # 如果是通过相对路径调用, 得到其绝对路径
  if [[ "${src}" != /* ]]; then
    src="$(cd -P -- "$(dirname -- "${src}")" && pwd)/$(basename -- "${src}")"
  fi

  # 解决符号链接, 获取其真实绝对路径
  local dir
  while [[ -L "${src}" ]]; do
    dir="$(cd -P -- "$(dirname -- "${src}")" && pwd)"
    src="$(readlink "${src}")"
    [[ "${src}" != /* ]] && src="${dir}/${src}"
  done

  cd -P -- "$(dirname -- "${src}")" && pwd
}

__radp_bf_setup() {
  local bin_dir
  bin_dir=$(__radp_bf_bin_dir)

  local project_src_root
  project_src_root=$(dirname "$bin_dir")

  # shellcheck source=../framework/init.sh
  source "$project_src_root"/framework/init.sh "$@"
}

__radp_bf_path() {
  case "${1:-}" in
  init)
    echo "${gr_fw_root_path}/init.sh"
    ;;
  launcher)
    echo "${gr_fw_root_path}/launcher.sh"
    ;;
  root)
    echo "${gr_fw_root_path}"
    ;;
  "")
    printf "%-17s %s\n" "Root path:" "$gr_fw_root_path"
    printf "%-17s %s\n" "Config path:" "$gr_fw_config_path"
    printf "%-17s %s\n" "User config path:" "$gr_fw_user_config_path"
    printf "%-17s %s\n" "User lib path:" "$gr_radp_fw_user_lib_path"
    ;;
  *)
    echo "radp-bf path: unknown name '${1}'" >&2
    echo "Available: init, launcher, root" >&2
    return 2
    ;;
  esac
}

__radp_bf_main() {
  # 丢弃打印 banner 等信息
  __radp_bf_setup "$@"

  case "${1:-}" in
  --help | -h | "")
    __radp_bf_usage
    return 0
    ;;
  --version)
    echo "$gr_fw_version"
    return 0
    ;;
  path)
    shift
    __radp_bf_path "${1:-}"
    return $?
    ;;
  new)
    shift
    if [[ -z "${1:-}" ]]; then
      echo "radp-bf new: project name required" >&2
      echo "Usage: radp-bf new <project-name> [target-dir]" >&2
      return 1
    fi
    radp_cli_scaffold_new "$@"
    return $?
    ;;
  *)
    echo "radp-bash-framework: unknown argument '${1}'" >&2
    __radp_bf_usage >&2
    return 2
    ;;
  esac
}

# default disable log and banner
GX_RADP_FW_LOG_CONSOLE_ENABLED=${GX_RADP_FW_LOG_CONSOLE_ENABLED:-false}
GX_RADP_FW_LOG_FILE_ENABLED=${GX_RADP_FW_LOG_FILE_ENABLED:-false}

__radp_bf_main "$@"
