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

repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$repo_root"

usage() {
  cat <<'EOF'
Usage:
  ai/chunks/transition.sh <chunk-id|path> --to <state> [options]

Compatibility facade only. Lifecycle transition sequencing and side effects are
owned by Blueprint Runtime Executor through the Runtime API daemon.
EOF
}

chunk=""
to=""
recommendation="unspecified"
approval_created=""
operator_hold=false
skip_governance=false
dry_run=false
mode=""
run_id=""

if (($# > 0)); then
  chunk="$1"
  shift
fi

while (($# > 0)); do
  case "$1" in
    --to) to="${2:?}"; shift 2 ;;
    --dry-run) dry_run=true; shift ;;
    --recommendation) recommendation="${2:?}"; shift 2 ;;
    --approval-created) approval_created="${2:?}"; shift 2 ;;
    --operator-hold) operator_hold=true; shift ;;
    --skip-governance) skip_governance=true; shift ;;
    --mode) mode="${2:?}"; shift 2 ;;
    --run-id) run_id="${2:?}"; shift 2 ;;
    -h|--help) usage; exit 0 ;;
    *) printf 'transition facade error: unknown argument: %s\n' "$1" >&2; exit 2 ;;
  esac
done

[[ -n "$chunk" && -n "$to" ]] || { usage >&2; exit 2; }

params="$(
  CHUNK="$chunk" TO="$to" RECOMMENDATION="$recommendation" APPROVAL_CREATED="$approval_created" \
  OPERATOR_HOLD="$operator_hold" SKIP_GOVERNANCE="$skip_governance" DRY_RUN="$dry_run" MODE="$mode" RUN_ID="$run_id" \
  node - <<'NODE'
const params = {
  chunk: process.env.CHUNK,
  to: process.env.TO,
  recommendation: process.env.RECOMMENDATION,
  operatorHold: process.env.OPERATOR_HOLD === 'true',
  skipGovernance: process.env.SKIP_GOVERNANCE === 'true',
  dryRun: process.env.DRY_RUN === 'true',
  env: {},
};
for (const key of [
  'CHUNK_LIFECYCLE_ACTIVE_DIR',
  'CHUNK_LIFECYCLE_BACKLOG_DIR',
  'CHUNK_LIFECYCLE_COMPLETED_DIR',
  'CHUNK_LIFECYCLE_DRAFTS_DIR',
  'ACTION_TIMELINE_STATE_DIR',
  'OQ_REPO_ROOT',
  'OQ_STATE_DIR',
  'OPERATOR_NOTIFICATIONS_STATE_DIR',
  'OPERATOR_NOTIFICATIONS_ACTIVE_CHUNKS_DIR',
  'TELEGRAM_STATE_DIR',
  'TELEGRAM_RUN_SUMMARY_RECORD_ONLY',
]) {
  if (process.env[key]) params.env[key] = process.env[key];
}
if (process.env.APPROVAL_CREATED) params.approvalCreated = process.env.APPROVAL_CREATED;
if (process.env.MODE) params.mode = process.env.MODE;
if (process.env.RUN_ID) params.runId = process.env.RUN_ID;
process.stdout.write(JSON.stringify(params));
NODE
)"

response="$(node ai/runtime/dist/cli.js request --method runtime.executor.transition --params "$params")"
RESPONSE="$response" node - <<'NODE'
const response = JSON.parse(process.env.RESPONSE || '{}');
const payload = response.result;
const out = payload && payload.result ? payload.result : {};
if (!response.ok || !payload || payload.ok === false) {
  const message = (payload && payload.message) || response.error?.message || 'transition failed';
  console.error(message);
  process.exit(1);
}
if (String(payload.code || '').includes('dry_run')) {
  console.log('Chunk lifecycle transition dry-run passed.');
} else {
  console.log('Chunk lifecycle transition executed.');
}
console.log(`chunk=${out.chunk || ''}`);
console.log(`transition=${out.transition || ''}`);
console.log(`approval_side_effect=${out.approval_side_effect || ''}`);
if (out.question_id) console.log(`question_id=${out.question_id}`);
NODE
