#!/usr/bin/env bash
# heyet.sh — proje ↔ heyet-agent köprüsü (youtrack.sh emsali).
# Bir projeden tek komutla heyet review başlatır / izler. Config'i (aşağıda) her projede düzenle.
#
# Kullanım:
#   heyet.sh review --ticket KRF-99 --title "..." --stage brainstorm --doc docs/x.md --request "..."
#   heyet.sh review --ticket KRF-99 --stage spec --doc docs/spec.md --request-file /tmp/brief.md
#   heyet.sh review ... --watch                 # başlat + bitene kadar izle
#   heyet.sh watch <review_id>                  # mevcut review'ı izle → verdict
#   heyet.sh status <review_id>                 # tek bakış
#   heyet.sh cancel <review_id> --onay          # ⛔ takılı review'ı iptal et — YALNIZ SETS SÖYLEYİNCE
#   heyet.sh projects | tasks                   # listele
#   heyet.sh open                               # panel URL'i (bu proje)
#
# ⛔ cancel HAKKINDA — okumadan kullanma:
#   Bir task'ta aynı anda tek review çalışır; çalışan varken yeni review
#   "task meşgul" ile reddedilir. Oturum düşerse kayıt `running` kalır ve
#   slotu kilitler (ölçüldü: review #166, 31.07.2026 — panel "boşta" derken
#   kayıt 30+ dk `running` kaldı, geçmiş maksimum 15 dk 35 sn idi).
#   cancel o kilidi açar; devam eden GERÇEK bir review'ı da öldürebilir.
#   Bu yüzden: kararı KULLANICININ'dır. Ajan kendiliğinden çağırmaz —
#   `--onay` bayrağı olmadan çalışmaz ve bayrak "Sets söyledi" demektir.
set -euo pipefail

# ===== PROJE CONFIG (her projede düzenle) =====
HEYET_URL="${HEYET_URL:-http://heyet.episteme.fyi}"
PROJECT_NAME="${HEYET_PROJECT_NAME:-3E-Egitim}"
REPO_PATH="${HEYET_REPO_PATH:-/Users/sets/Projects/3e-egitim}"
HEYET_MD="${HEYET_MD_PATH:-docs/claude/heyet.md}"
# ==============================================

STAGES="brainstorm spec plan implementation"
c(){ printf '%b' "$1"; }; GRN='\033[32m'; RED='\033[31m'; YLW='\033[33m'; DIM='\033[2m'; RST='\033[0m'
die(){ echo "heyet.sh: $*" >&2; exit 1; }
api(){ curl -s "$@"; }

ensure_project(){
  local id
  id=$(api "$HEYET_URL/api/projects" | jq -r --arg n "$PROJECT_NAME" '.[]|select(.name==$n)|.id' | head -1)
  if [ -z "$id" ] || [ "$id" = "null" ]; then
    id=$(api -X POST "$HEYET_URL/api/projects" -H 'content-type: application/json' \
      -d "$(jq -nc --arg n "$PROJECT_NAME" --arg r "$REPO_PATH" --arg h "$HEYET_MD" '{name:$n,repo_path:$r,heyet_md_path:$h}')" \
      | jq -r '.id')
  fi
  echo "$id"
}
ensure_task(){ # pid ticket title
  api -X POST "$HEYET_URL/api/tasks" -H 'content-type: application/json' \
    -d "$(jq -nc --argjson p "$1" --arg t "$2" --arg ti "$3" '{projectId:$p,externalTicketId:$t,title:$ti}')" | jq -r '.id'
}

cmd_watch(){ # review_id
  local rid="$1" j status
  [ -z "$rid" ] && die "watch <review_id> gerekli"
  echo -e "${DIM}izleniyor (review $rid)…${RST}"
  while :; do
    j=$(api "$HEYET_URL/api/reviews/$rid")
    status=$(echo "$j" | jq -r '.review.status')
    [ "$status" != "running" ] && break
    echo "$j" | jq -r '.events[-1] | "  \(.kind) \((.payload.name // .payload.text // "")[0:70] // "")"' 2>/dev/null || true
    sleep 3
  done
  if [ "$status" = "waiting_answer" ]; then
    echo -e "\n${YLW}⏸ DURAKLADI — kurucu cevabı bekleniyor${RST}"
    echo "$j" | jq -r '"soru: \(.review.pending_question // (.review.findings//["-"])[0])"'
    echo -e "${DIM}cevapla: heyet.sh answer $rid \"<cevabın>\"${RST}"
    return 2
  fi
  local verdict; verdict=$(echo "$j" | jq -r '.review.verdict // "—"')
  local col=$YLW; [ "$verdict" = "APPROVED" ] && col=$GRN; [ "$verdict" = "REJECTED" ] && col=$RED
  echo -e "\n${col}verdict: $verdict${RST}"
  echo "$j" | jq -r '"review : \(.review.review_file // "-")\nbulgu  : \((.review.findings//[])|length)"'
  echo "$j" | jq -r '(.review.findings//[])[] | "  • \(.)"'
  echo -e "${DIM}panel: $HEYET_URL/tasks/\(($(echo "$j"|jq -r .review.task_id)))${RST}"
}

cmd_answer(){ # review_id cevap...
  local rid="$1"; shift; local ans="$*"
  [ -z "$rid" ] && die "answer <review_id> <cevap>"
  [ -z "$ans" ] && ans="$(cat)"
  [ -z "$ans" ] && die "cevap gerekli (arg veya stdin)"
  api -X POST "$HEYET_URL/api/reviews/$rid/answer" -H 'content-type: application/json' \
    -d "$(jq -nc --arg a "$ans" '{answer:$a}')" | jq -r 'if .ok then "cevap gönderildi → review \(.review_id) devam ediyor" else ("HATA: "+(.error//"?")) end'
  cmd_watch "$rid"
}

# ⛔ Takılı review'ı iptal eder. Kararı kullanıcınındır; `--onay` olmadan
# çalışmaz. Gerekçesi başlıktaki nottadır.
cmd_cancel(){
  local rid="${1:-}" ok=0
  shift || true
  while [ $# -gt 0 ]; do case "$1" in
    --onay|--confirm) ok=1; shift;;
    *) die "bilinmeyen argüman: $1";;
  esac; done

  [ -z "$rid" ] && die "cancel <review_id> --onay"
  [ "$ok" = 1 ] || die "cancel yalnız --onay ile çalışır — ve --onay 'Sets söyledi' demektir."

  local before code
  before=$(api "$HEYET_URL/api/reviews/$rid" | jq -r '.review.status // "?"')
  [ "$before" = "running" ] || echo -e "${YLW}uyarı: review $rid durumu '$before' — zaten çalışmıyor.${RST}"

  code=$(curl -s -o /tmp/heyet-cancel.$$ -w '%{http_code}' -X POST \
    "$HEYET_URL/api/reviews/$rid/cancel" -H 'content-type: application/json' -d '{}' || true)

  case "$code" in
    2*) echo -e "${GRN}review $rid iptal edildi${RST} ${DIM}(önceki durum: $before)${RST}";;
    404)
      # ⚠ Route yok demek — komut hazır, sunucu değil. Sessizce "başarılı"
      # demek, kilidin açıldığını sanıp yeni review denemeye yol açar.
      echo -e "${RED}sunucuda iptal endpoint'i YOK${RST} (POST /api/reviews/$rid/cancel → 404)."
      echo "  heyet-agent tarafına eklenmesi gerekiyor. O zamana kadar iki yol var:"
      echo "  1) panelden iptal et: $HEYET_URL/tasks/<task_id>"
      echo "  2) review'ı başka bir task altında koştur (kilit task bazlıdır)"
      rm -f /tmp/heyet-cancel.$$; exit 3;;
    *) echo -e "${RED}iptal başarısız${RST} (HTTP $code): $(cat /tmp/heyet-cancel.$$ 2>/dev/null | head -c 300)"; rm -f /tmp/heyet-cancel.$$; exit 4;;
  esac
  rm -f /tmp/heyet-cancel.$$
}

cmd_review(){
  local TICKET="" TITLE="" STAGE="" DOC="" REQ="" REQFILE="" WATCH=0
  while [ $# -gt 0 ]; do case "$1" in
    --ticket) TICKET="$2"; shift 2;;
    --title) TITLE="$2"; shift 2;;
    --stage) STAGE="$2"; shift 2;;
    --doc) DOC="$2"; shift 2;;
    --request) REQ="$2"; shift 2;;
    --request-file) REQFILE="$2"; shift 2;;
    --watch) WATCH=1; shift;;
    *) die "bilinmeyen arg: $1";;
  esac; done
  [ -z "$TICKET" ] && die "--ticket gerekli"
  [ -z "$TITLE" ] && TITLE="$TICKET"
  echo "$STAGES" | grep -qw "$STAGE" || die "--stage ∈ $STAGES"
  [ -n "$REQFILE" ] && REQ="$(cat "$REQFILE")"
  [ -z "$REQ" ] && REQ="$(cat)"   # stdin fallback
  [ -z "$REQ" ] && die "--request / --request-file / stdin gerekli"

  local pid tid resp rid
  pid=$(ensure_project); [ -z "$pid" ] && die "proje oluşturulamadı"
  tid=$(ensure_task "$pid" "$TICKET" "$TITLE")
  resp=$(api -X POST "$HEYET_URL/api/reviews" -H 'content-type: application/json' \
    -d "$(jq -nc --argjson t "$tid" --arg s "$STAGE" --arg d "$DOC" --arg r "$REQ" \
      '{taskId:$t,stage:$s,doc_path:($d|select(length>0)),request_text:$r}')")
  rid=$(echo "$resp" | jq -r '.id // empty')

  # ⛔ Sunucunun reddini YUT-MA. Eskiden id null gelince "review null başladı"
  # yazıp çıkıyordu; kullanıcı başladığını sanıyordu (ölçüldü 31.07.2026 —
  # task meşguldü, review hiç açılmamıştı).
  if [ -z "$rid" ]; then
    echo -e "${RED}review BAŞLATILAMADI${RST}"
    echo "$resp" | jq -r 'if .error then "  sebep: \(.error)" else "  yanıt: \(.)" end'
    echo "$resp" | jq -e '.active_review_id' >/dev/null 2>&1 && \
      echo -e "  ${DIM}takılı review'ı iptal: heyet.sh cancel $(echo "$resp" | jq -r .active_review_id) --onay ${RST}"
    exit 5
  fi

  echo -e "${GRN}review $rid başladı${RST} ${DIM}(proje $pid · task $tid · $STAGE)${RST}"
  echo -e "${DIM}panel: $HEYET_URL/tasks/$tid${RST}"
  [ "$WATCH" = 1 ] && cmd_watch "$rid"
}

case "${1:-}" in
  review) shift; cmd_review "$@";;
  watch)  cmd_watch "${2:-}";;
  answer) shift; cmd_answer "$@";;
  status) api "$HEYET_URL/api/reviews/${2:?review_id gerekli}" | jq '{status:.review.status,verdict:.review.verdict,file:.review.review_file,bulgu:((.review.findings//[])|length)}';;
  cancel) shift; cmd_cancel "$@";;
  projects) api "$HEYET_URL/api/projects" | jq -r '.[] | "\(.id)  \(.name)  \(.task_count) task  son:\(.last_activity // "-")"';;
  tasks) pid=$(ensure_project); api "$HEYET_URL/api/tasks?project=$pid" | jq -r '.[] | "\(.id)  \(.external_ticket_id // "-")  \(.title)"';;
  open) echo "$HEYET_URL";;
  *) tail -n +2 "$0" | grep '^#' | sed 's/^# \{0,1\}//' | head -14;;
esac
