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

PROJECT_ROOT="${PROJECT_ROOT:-/home/happyuser/projects/DEX}"
SUPERVISOR_TIMEBOX_SECONDS="${SUPERVISOR_TIMEBOX_SECONDS:-900}"
SUPERVISOR_ON_SUCCESS="${SUPERVISOR_ON_SUCCESS:-1}"
SUPERVISOR_ON_ERROR="${SUPERVISOR_ON_ERROR:-1}"

usage() {
  cat <<'USAGE'
Usage:
  scripts/run_tmux_supervised.sh <tmux_session_name> <command string>

Example:
  scripts/run_tmux_supervised.sh bio_refresh 'python3 dex_platform/scripts/example.py --flag'

When the command exits, this wrapper writes .agent/events/<run>.md. The
control-room loop decides when to wake Codex. Override with
SUPERVISOR_ON_SUCCESS=0 or SUPERVISOR_ON_ERROR=0 to suppress event creation on
that outcome.
USAGE
}

if [[ "${1:-}" == "-h" || "${1:-}" == "--help" || "$#" -lt 2 ]]; then
  usage
  exit 2
fi

SESSION_NAME="$1"
shift
COMMAND="$*"

cd "$PROJECT_ROOT"
mkdir -p .agent/events .agent/tmux_logs .agent/tmux_wrappers

RUN_ID="$(date -u +%Y%m%dT%H%M%SZ)"
SAFE_SESSION="$(printf '%s' "$SESSION_NAME" | tr -c 'A-Za-z0-9_.-' '_')"
WRAPPER="$PROJECT_ROOT/.agent/tmux_wrappers/${SAFE_SESSION}_${RUN_ID}.sh"
LOG_FILE="$PROJECT_ROOT/.agent/tmux_logs/${SAFE_SESSION}_${RUN_ID}.log"
EVENT_FILE="$PROJECT_ROOT/.agent/events/${SAFE_SESSION}_${RUN_ID}.md"

printf -v COMMAND_Q '%q' "$COMMAND"
printf -v PROJECT_ROOT_Q '%q' "$PROJECT_ROOT"
printf -v LOG_FILE_Q '%q' "$LOG_FILE"
printf -v EVENT_FILE_Q '%q' "$EVENT_FILE"
printf -v SESSION_NAME_Q '%q' "$SESSION_NAME"
printf -v RUN_ID_Q '%q' "$RUN_ID"
printf -v TIMEBOX_Q '%q' "$SUPERVISOR_TIMEBOX_SECONDS"
printf -v ON_SUCCESS_Q '%q' "$SUPERVISOR_ON_SUCCESS"
printf -v ON_ERROR_Q '%q' "$SUPERVISOR_ON_ERROR"

cat > "$WRAPPER" <<EOF
#!/usr/bin/env bash
set -Eeuo pipefail

PROJECT_ROOT=$PROJECT_ROOT_Q
SESSION_NAME=$SESSION_NAME_Q
RUN_ID=$RUN_ID_Q
COMMAND=$COMMAND_Q
LOG_FILE=$LOG_FILE_Q
EVENT_FILE=$EVENT_FILE_Q
SUPERVISOR_TIMEBOX_SECONDS=$TIMEBOX_Q
SUPERVISOR_ON_SUCCESS=$ON_SUCCESS_Q
SUPERVISOR_ON_ERROR=$ON_ERROR_Q

cd "\$PROJECT_ROOT"
mkdir -p .agent/events .agent/tmux_logs

START_UTC="\$(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo "===== tmux supervised start: \$START_UTC =====" | tee -a "\$LOG_FILE"
echo "session=\$SESSION_NAME" | tee -a "\$LOG_FILE"
echo "command=\$COMMAND" | tee -a "\$LOG_FILE"

set +e
bash -lc "\$COMMAND" 2>&1 | tee -a "\$LOG_FILE"
CMD_RC=\${PIPESTATUS[0]}
set -e

END_UTC="\$(date -u +%Y-%m-%dT%H:%M:%SZ)"
STATUS="success"
if [[ "\$CMD_RC" != "0" ]]; then
  STATUS="error"
fi

{
  echo "# Tmux Job Event"
  echo
  echo "run_id: \$RUN_ID"
  echo "session: \$SESSION_NAME"
  echo "status: \$STATUS"
  echo "exit_code: \$CMD_RC"
  echo "started_utc: \$START_UTC"
  echo "finished_utc: \$END_UTC"
  echo "project_root: \$PROJECT_ROOT"
  echo "log_file: \$LOG_FILE"
  echo
  echo "## Command"
  echo '\`\`\`bash'
  echo "\$COMMAND"
  echo '\`\`\`'
  echo
  echo "## Log Tail"
  echo '\`\`\`text'
  tail -120 "\$LOG_FILE" || true
  echo '\`\`\`'
} > "\$EVENT_FILE"

echo "===== tmux supervised exit=\$CMD_RC: \$END_UTC =====" | tee -a "\$LOG_FILE"
echo "event_file=\$EVENT_FILE" | tee -a "\$LOG_FILE"

SHOULD_WRITE_EVENT=0
if [[ "\$CMD_RC" == "0" && "\$SUPERVISOR_ON_SUCCESS" == "1" ]]; then
  SHOULD_WRITE_EVENT=1
fi
if [[ "\$CMD_RC" != "0" && "\$SUPERVISOR_ON_ERROR" == "1" ]]; then
  SHOULD_WRITE_EVENT=1
fi

if [[ "\$SHOULD_WRITE_EVENT" != "1" ]]; then
  rm -f "\$EVENT_FILE"
  echo "event suppressed by outcome flags" | tee -a "\$LOG_FILE"
fi

exit "\$CMD_RC"
EOF

chmod +x "$WRAPPER"

tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_ROOT" "$WRAPPER"

echo "Started supervised tmux session: $SESSION_NAME"
echo "Command: $COMMAND"
echo "Log: $LOG_FILE"
echo "Event will be written after completion: $EVENT_FILE"
