# shellcheck shell=bash

collect_required_arguments() {
  local missing_required=""

  missing_required="$(missing_required_arguments_summary)"
  if [[ -z "$missing_required" ]]; then
    return 0
  fi
  if [[ "$ASSUME_YES" == "true" ]]; then
    printf '%s\n' "--yes requires all required arguments. Missing: $missing_required" >&2
    usage
    exit 1
  fi

  if ! is_interactive_session; then
    printf 'missing required arguments: %s\n' "$missing_required" >&2
    usage
    exit 1
  fi

  printf 'okstra is missing required arguments. Please provide the following values.\n' >&2
  prompt_for_required_argument PROJECT_ID "Project ID"
  prompt_for_required_argument TASK_GROUP "Task Group"
  prompt_for_required_argument TASK_ID "Task ID"
  prompt_for_required_argument TASK_TYPE "Task Type"
  if [[ "$TASK_TYPE" != "release-handoff" ]]; then
    # release-handoff 는 brief 가 없다 — prepare 가 검증 보고서 인용 input 을 생성.
    prompt_for_required_argument BRIEF_PATH "Task Brief Path"
  fi
}

require_option_value() {
  local option_name="$1"
  local option_value="${2-}"

  if [[ -z "$option_value" ]]; then
    printf 'missing value for %s\n' "$option_name" >&2
    usage
    exit 1
  fi

  printf '%s' "$option_value"
}

parse_cli_arguments() {
while [[ $# -gt 0 ]]; do
  case "$1" in
    --render-only)
      RENDER_ONLY="true"
      shift
      ;;
    --resume-clarification)
      RESUME_CLARIFICATION_MODE="true"
      shift
      ;;
    --resume-session)
      RESUME_SESSION_MODE="true"
      RESUME_SESSION_ID="$(require_option_value --resume-session "${2-}")"
      shift 2
      ;;
    --yes)
      ASSUME_YES="true"
      shift
      ;;
    --workers)
      WORKERS_OVERRIDE="$(require_option_value --workers "${2-}")"
      shift 2
      ;;
    --role-count)
      ROLE_COUNTS+=("$(require_option_value --role-count "${2-}")")
      shift 2
      ;;
    --role-model)
      ROLE_MODELS+=("$(require_option_value --role-model "${2-}")")
      shift 2
      ;;
    --host-session-context-json)
      HOST_SESSION_CONTEXT_JSON="$(require_option_value --host-session-context-json "${2-}")"
      shift 2
      ;;
    --lead-model)
      LEAD_MODEL_OVERRIDE="$(require_option_value --lead-model "${2-}")"
      shift 2
      ;;
    --lead-provider)
      LEAD_PROVIDER_OVERRIDE="$(require_option_value --lead-provider "${2-}")"
      shift 2
      ;;
    --claude-model)
      CLAUDE_MODEL_OVERRIDE="$(require_option_value --claude-model "${2-}")"
      shift 2
      ;;
    --codex-model)
      CODEX_MODEL_OVERRIDE="$(require_option_value --codex-model "${2-}")"
      shift 2
      ;;
    --antigravity-model)
      ANTIGRAVITY_MODEL_OVERRIDE="$(require_option_value --antigravity-model "${2-}")"
      shift 2
      ;;
    --worker-model)
      WORKER_MODELS_OVERRIDE="$(require_option_value --worker-model "${2-}")"
      shift 2
      ;;
    --report-writer-provider)
      REPORT_WRITER_PROVIDER_OVERRIDE="$(require_option_value --report-writer-provider "${2-}")"
      shift 2
      ;;
    --report-writer-model)
      REPORT_WRITER_MODEL_OVERRIDE="$(require_option_value --report-writer-model "${2-}")"
      shift 2
      ;;
    --launch-only)
      LAUNCH_ONLY="true"
      shift
      ;;
    --lead-runtime)
      LEAD_RUNTIME="$(require_option_value --lead-runtime "${2-}")"
      shift 2
      ;;
    --executor)
      EXECUTOR_OVERRIDE="$(require_option_value --executor "${2-}")"
      shift 2
      ;;
    --critic)
      CRITIC_CHOICE="$(require_option_value --critic "${2-}")"
      shift 2
      ;;
    --related-tasks)
      RELATED_TASKS_RAW="$(require_option_value --related-tasks "${2-}")"
      shift 2
      ;;
    --work-category)
      WORK_CATEGORY="$(require_option_value --work-category "${2-}")"
      shift 2
      ;;
    --base-ref)
      BASE_REF="$(require_option_value --base-ref "${2-}")"
      shift 2
      ;;
    --stage)
      STAGE="$(require_option_value --stage "${2-}")"
      shift 2
      ;;
    --stages)
      STAGES="$(require_option_value --stages "${2-}")"
      shift 2
      ;;
    --qa-waiver)
      QA_WAIVER="$(require_option_value --qa-waiver "${2-}")"
      shift 2
      ;;
    --task-type)
      TASK_TYPE="$(require_option_value --task-type "${2-}")"
      shift 2
      ;;
    --project-id)
      PROJECT_ID="$(require_option_value --project-id "${2-}")"
      shift 2
      ;;
    --project-root)
      PROJECT_ROOT_OVERRIDE="$(require_option_value --project-root "${2-}")"
      shift 2
      ;;
    --task-group)
      TASK_GROUP="$(require_option_value --task-group "${2-}")"
      shift 2
      ;;
    --task-id)
      TASK_ID="$(require_option_value --task-id "${2-}")"
      shift 2
      ;;
    --task-brief)
      BRIEF_PATH="$(require_option_value --task-brief "${2-}")"
      shift 2
      ;;
    --directive)
      DIRECTIVE="$(require_option_value --directive "${2-}")"
      shift 2
      ;;
    --fix-cycle)
      FIX_CYCLE="$(require_option_value --fix-cycle "${2-}")"
      shift 2
      ;;
    --clarification-response)
      CLARIFICATION_RESPONSE_PATH="$(require_option_value --clarification-response "${2-}")"
      shift 2
      ;;
    --selected-direction)
      SELECTED_DIRECTION_PATH="$(require_option_value --selected-direction "${2-}")"
      shift 2
      ;;
    --task-key)
      TASK_KEY_INPUT="$(require_option_value --task-key "${2-}")"
      shift 2
      ;;
    --approved-plan)
      APPROVED_PLAN_PATH="$(require_option_value --approved-plan "${2-}")"
      shift 2
      ;;
    --approve)
      # 사용자가 CLI 명령을 입력한 행위 자체를 plan 승인 의사로 간주한다.
      # 런타임에서 approved-plan 파일의 승인 체크박스를 [x] 로 갱신하고
      # 승인 시각/방식을 함께 기록한다 (scripts/okstra_ctl/run.py 참조).
      APPROVE_PLAN_ACK="true"
      shift
      ;;
    --implementation-option)
      # 유저가 implementation-planning final-report 에서 고른 Option Candidate
      # 이름. 런타임이 approved-plan frontmatter 의 implementation-option 라인을
      # 이 값으로 채운다. 빈 값이면 implementation 이 Recommended Option 으로 폴백.
      IMPLEMENTATION_OPTION="$(require_option_value --implementation-option "${2-}")"
      shift 2
      ;;
    --no-plan-verification)
      # implementation-planning 의 Phase 6 plan-body verification 라운드를
      # 끈다. 기본값은 활성화. 비활성 시 final-report 상단의 User Approval
      # 체크박스는 무조건 렌더된다 (legacy 동작). 빠른 반복용 opt-out.
      PLAN_VERIFICATION_ENABLED="false"
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    -*)
      __unknown_opt="$1"
      __opt_name="${__unknown_opt%%=*}"
      printf 'unknown option: %s\n' "$__unknown_opt" >&2
      case "$__opt_name" in
        --phase|--phases|--lifecycle-phase)
          printf '  hint: --phase is not a valid flag. Use --task-type <requirements-discovery|error-analysis|implementation-planning|implementation|final-verification|release-handoff>.\n' >&2
          printf '        "phase" is a manifest lifecycle field name, not a CLI option.\n' >&2
          ;;
        --brief|--task-brief)
          printf '  hint: did you mean --task-brief?\n' >&2
          ;;
        --analysis-target|--target|--review-target)
          printf '  hint: --analysis-target was removed. Put supplementary materials inside the task brief itself.\n' >&2
          ;;
        --project|--proj)
          printf '  hint: did you mean --project-id?\n' >&2
          ;;
        --group)
          printf '  hint: did you mean --task-group?\n' >&2
          ;;
        --id)
          printf '  hint: did you mean --task-id?\n' >&2
          ;;
      esac
      printf '  valid options: --render-only --resume-clarification --yes --workers --lead-provider --lead-model --claude-model --codex-model --antigravity-model --worker-model --report-writer-provider --report-writer-model --lead-runtime --executor --critic --related-tasks --work-category --task-type --project-id --project-root --task-group --task-id --task-brief --directive --base-ref --fix-cycle --clarification-response --selected-direction --task-key --approved-plan --approve --implementation-option --stage --stages --qa-waiver --no-plan-verification -h|--help\n' >&2
      usage
      exit 1
      ;;
    *)
      printf 'unexpected positional argument: %s\n' "$1" >&2
      if [[ "$1" == *:*:* ]]; then
        __key_proj="${1%%:*}"
        __key_rest="${1#*:}"
        __key_group="${__key_rest%%:*}"
        __key_id="${__key_rest#*:}"
        printf '  hint: looks like a manifest taskKey (project:group:id). Pass it via --task-key, e.g. --task-key %s:%s:%s\n' "$__key_proj" "$__key_group" "$__key_id" >&2
      else
        printf '  hint: all inputs must be passed as named flags. See usage below.\n' >&2
      fi
      usage
      exit 1
      ;;
  esac
done
}
