#!/usr/bin/env zsh

set -eu

repo_dir="${0:A:h}"
source "$repo_dir/func"

failures=0

assert_equal() {
  local expected="$1"
  local actual="$2"
  local label="$3"

  if [ "$actual" != "$expected" ]; then
    print -u2 -- "FAIL: $label (expected '$expected', got '$actual')"
    failures=$((failures + 1))
  fi
}

assert_contains() {
  local output="$1"
  local expected="$2"
  local label="$3"

  if [[ "$output" != *"$expected"* ]]; then
    print -u2 -- "FAIL: $label (missing '$expected')"
    failures=$((failures + 1))
  fi
}

plugin_state() {
  printf '%s\n' "$1" | _plan_build_superpowers_state
}

assert_equal "enabled" "$(plugin_state '[{"id":"superpowers@claude-plugins-official","enabled":true}]')" "compact enabled JSON"
assert_equal "disabled" "$(plugin_state $'[\n  {\n    "enabled": false,\n    "id": "superpowers@claude-plugins-official"\n  }\n]')" "reordered disabled JSON"
assert_equal "enabled" "$(plugin_state $'[\n  {"enabled": false, "id": "other@market"},\n  {"enabled": true, "id": "superpowers@claude-plugins-official"}\n]')" "multiple plugin JSON"
assert_equal "missing" "$(plugin_state '[{"id":"coderabbit@claude-plugins-official","enabled":true}]')" "missing plugin JSON"
assert_equal "installed" "$(plugin_state '[{"id":"superpowers@claude-plugins-official"}]')" "malformed plugin JSON"

output="$(plan_build --brainstorm --writing-plan 2>&1)" && rc=0 || rc=$?
assert_equal "1" "$rc" "mutually exclusive flags status"
assert_contains "$output" "mutually exclusive" "mutually exclusive flags message"

output="$(plan_build --brainstorm --brainstorm 2>&1)" && rc=0 || rc=$?
assert_equal "1" "$rc" "duplicate brainstorm status"
assert_contains "$output" "Duplicate argument: --brainstorm" "duplicate brainstorm message"

output="$(plan_build --writing-plan --writing-plan 2>&1)" && rc=0 || rc=$?
assert_equal "1" "$rc" "duplicate writing-plan status"
assert_contains "$output" "Duplicate argument: --writing-plan" "duplicate writing-plan message"

export CLAUDE_CODE_SAFE_MODE=1
output="$(_plan_build_superpowers_preflight 2>&1)" && rc=0 || rc=$?
unset CLAUDE_CODE_SAFE_MODE
assert_equal "1" "$rc" "safe mode status"
assert_contains "$output" "safe mode disables Superpowers" "safe mode message"

require_cli() { return 0; }
_plan_build_superpowers_preflight() { return 0; }
claude() {
  printf 'CLAUDE_ARGS:'
  printf ' <%s>' "$@"
  printf '\n'
}

output="$(printf 'build feature\nEOF\n' | plan_build --writing-plan --yolo 2>&1)" && rc=0 || rc=$?
assert_equal "0" "$rc" "writing-plan launch status"
assert_contains "$output" "Planning mode: writing-plan" "writing-plan prompt"
assert_contains "$output" "<--yolo>" "yolo forwarding"

output="$(printf 'build feature\nEOF\n' | plan_build --brainstorm 2>&1)" && rc=0 || rc=$?
assert_equal "0" "$rc" "brainstorm launch status"
assert_contains "$output" "Planning mode: brainstorm" "brainstorm prompt"

output="$(printf 'build feature\nEOF\n' | plan_build 2>&1)" && rc=0 || rc=$?
assert_equal "0" "$rc" "standard launch status"
assert_contains "$output" "Planning mode: standard" "standard prompt"

if [ "$failures" -ne 0 ]; then
  exit 1
fi

print -- "PASS: plan_build tests"
