#!/usr/bin/env bash
NODECLAW_HELPER_WAS_SOURCED=false
NODECLAW_HELPER_SAVED_SHELLOPTS=''
if (return 0 2>/dev/null); then
  NODECLAW_HELPER_WAS_SOURCED=true
  NODECLAW_HELPER_SAVED_SHELLOPTS="$(set +o)"
fi
set -euo pipefail

SETTINGS_PATH="${CLAUDE_CODE_SETTINGS_PATH:-$HOME/.claude/settings.json}"
NODECLAW_API_KEY="${NODECLAW_API_KEY:-}"
NODECLAW_BASE_URL="${NODECLAW_BASE_URL:-https://payg.nodenetwork.ovh}"
NODECLAW_INSTALL_MODE="${NODECLAW_INSTALL_MODE:-auto}"
NODECLAW_INTERACTIVE="${NODECLAW_INTERACTIVE:-auto}"
NODECLAW_PROMPTED_API_KEY="${NODECLAW_PROMPTED_API_KEY:-}"
HELPER_CAPABILITY='env-default'
DRY_RUN=false
LAUNCHER_ENV_APPLY=false

is_helper_sourced() {
  [ "$NODECLAW_HELPER_WAS_SOURCED" = true ]
}

restore_helper_shellopts() {
  if is_helper_sourced && [ -n "$NODECLAW_HELPER_SAVED_SHELLOPTS" ]; then
    eval "$NODECLAW_HELPER_SAVED_SHELLOPTS"
  fi
}

resolve_install_mode() {
  local requested="$1"
  local capability="$2"

  case "$requested" in
    env)
      if [ "$capability" = 'persistent-primary' ]; then
        printf 'persistent\n'
      else
        printf 'env\n'
      fi
      return 0
      ;;
    persistent)
      printf 'persistent\n'
      return 0
      ;;
    auto|'')
      ;;
    *)
      printf 'Unsupported install mode: %s\n' "$requested" >&2
      return 1
      ;;
  esac

  case "$capability" in
    env-default|hybrid)
      printf 'env\n'
      ;;
    persistent-primary)
      printf 'persistent\n'
      ;;
    *)
      printf 'persistent\n'
      ;;
  esac
}

prompt_input_is_available() {
  [ -t 0 ] || { [ -r /dev/tty ] && [ -w /dev/tty ]; }
}

read_prompt_value() {
  local __var_name="$1"

  if [ -t 0 ]; then
    IFS= read -r "$__var_name"
  elif [ -r /dev/tty ] && [ -w /dev/tty ]; then
    IFS= read -r "$__var_name" < /dev/tty
  else
    return 1
  fi
}

print_prompt_message() {
  local message="$1"

  if [ -w /dev/tty ]; then
    printf '%s' "$message" > /dev/tty
  else
    printf '%s' "$message" >&2
  fi
}

helper_allows_prompt() {
  case "$NODECLAW_INTERACTIVE" in
    true|TRUE|1|yes|YES)
      return 0
      ;;
    false|FALSE|0|no|NO)
      return 1
      ;;
    auto|'')
      prompt_input_is_available
      ;;
    *)
      printf 'NODECLAW_INTERACTIVE must be auto, true, or false.\n' >&2
      return 1
      ;;
  esac
}

prompt_nodeclaw_api_key_if_needed() {
  if [ -n "$NODECLAW_API_KEY" ]; then
    return 0
  fi

  if ! helper_allows_prompt; then
    printf 'NODECLAW_API_KEY is required for apply. Re-run in a supported interactive same-session path or choose an explicit persistent/export path.\n' >&2
    return 1
  fi

  print_prompt_message 'Enter NodeClaw API key: '
  if ! read_prompt_value NODECLAW_API_KEY; then
    printf 'NODECLAW_API_KEY entry cancelled.\n' >&2
    return 1
  fi
  if [ -z "$NODECLAW_API_KEY" ]; then
    printf 'NODECLAW_API_KEY cannot be empty.\n' >&2
    return 1
  fi

  NODECLAW_PROMPTED_API_KEY='true'
  export NODECLAW_API_KEY NODECLAW_PROMPTED_API_KEY
}

require_same_shell_for_env_apply() {
  if is_helper_sourced; then
    return 0
  fi

  printf 'Claude Code env apply must run in the same shell. Re-run with a sourced helper or the sourced launcher command.\n' >&2
  return 1
}

shell_quote_value() {
  local value="${1-}"
  value="${value//\\/\\\\}"
  value="${value//\"/\\\"}"
  value="${value//\$/\\\$}"
  value="${value//\`/\\\`}"
  printf '"%s"' "$value"
}

render_export_line() {
  local name="$1"
  local value="$2"
  printf 'export %s=%s\n' "$name" "$(shell_quote_value "$value")"
}

main() {
  local arg
  for arg in "$@"; do
    case "$arg" in
      --dry-run)
        DRY_RUN=true
        ;;
      --from-launcher-env-apply)
        LAUNCHER_ENV_APPLY=true
        ;;
      *)
        printf 'Unknown argument: %s\n' "$arg" >&2
        printf 'Usage: NODECLAW_INSTALL_MODE="auto|env|persistent" NODECLAW_API_KEY="<nodeclaw_access_key>" bash ./script/setup-claude-code-nodeclaw.sh [--dry-run] [--from-launcher-env-apply]\n' >&2
        return 1
        ;;
    esac
  done

  local resolved_install_mode
  if ! resolved_install_mode="$(resolve_install_mode "$NODECLAW_INSTALL_MODE" "$HELPER_CAPABILITY")"; then
    return 1
  fi
  RESOLVED_INSTALL_MODE="$resolved_install_mode"

  printf 'Target Claude Code posture: env-first session contract\n'
  printf 'Capability class: %s\n' "$HELPER_CAPABILITY"
  printf 'Requested install mode: %s\n' "$NODECLAW_INSTALL_MODE"
  printf 'Install mode: %s\n' "$RESOLVED_INSTALL_MODE"
  printf 'Endpoint root: %s\n' "$NODECLAW_BASE_URL"
  printf '\n'

  if [ "$RESOLVED_INSTALL_MODE" = 'env' ]; then
    if [ "$DRY_RUN" = true ]; then
      printf 'Dry run only. Planned session env exports:\n\n'
      render_export_line 'NODECLAW_API_KEY' '<nodeclaw_access_key>'
      render_export_line 'ANTHROPIC_BASE_URL' "$NODECLAW_BASE_URL"
      printf 'export ANTHROPIC_AUTH_TOKEN="$NODECLAW_API_KEY"\n'
      return 0
    fi

    require_same_shell_for_env_apply || return 1
    prompt_nodeclaw_api_key_if_needed || return 1
    export NODECLAW_API_KEY
    export ANTHROPIC_BASE_URL="$NODECLAW_BASE_URL"
    export ANTHROPIC_AUTH_TOKEN="$NODECLAW_API_KEY"
    printf 'Applied Claude Code env contract in the current shell.\n'
    printf 'Now run Claude Code yourself from this same shell:\n'
    printf '  claude\n'
    return 0
  fi

  local preview_api_key='<nodeclaw_access_key>'
  if [ "$DRY_RUN" != true ]; then
    prompt_nodeclaw_api_key_if_needed || return 1
    preview_api_key="$NODECLAW_API_KEY"
  fi

  if ! python3 - <<'PY' "$SETTINGS_PATH" "$preview_api_key" "$NODECLAW_BASE_URL" "$DRY_RUN"
import json
import pathlib
import sys

settings_path = pathlib.Path(sys.argv[1]).expanduser()
api_key = sys.argv[2]
base_url = sys.argv[3]
dry_run = sys.argv[4].lower() == 'true'

if settings_path.exists():
    raw = settings_path.read_text(encoding='utf-8').strip()
    data = json.loads(raw) if raw else {}
else:
    data = {}

env = data.setdefault('env', {})
env['ANTHROPIC_BASE_URL'] = base_url
env['ANTHROPIC_AUTH_TOKEN'] = api_key

env.setdefault('CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS', '1')
env.setdefault('DISABLE_INTERLEAVED_THINKING', '1')

rendered = json.dumps(data, indent=2, ensure_ascii=False)

print(f'Target Claude Code settings: {settings_path}')

if dry_run:
    print('\nDry run only. Planned Claude Code settings:\n')
    print(rendered)
else:
    settings_path.parent.mkdir(parents=True, exist_ok=True)
    settings_path.write_text(rendered + '\n', encoding='utf-8')
    print(f'\nWrote Claude Code settings to {settings_path}')
PY
  then
    return 1
  fi

  return 0
}

main "$@"
helper_status=$?
restore_helper_shellopts
if is_helper_sourced; then
  return "$helper_status"
fi
exit "$helper_status"
