#!/bin/bash
# aria-worker-auto-approve.sh
# Args: <worker-name> <worker-session>
# Started by aria-worker.sh as a background job.
# NEVER modifies or targets the "aria" CEO session.

set -euo pipefail

WORKER_NAME="$1"
WORKER_SESSION="$2"
STATE_DIR="/root/aria/state/workers/${WORKER_NAME}"
LOG="${STATE_DIR}/approve.log"
MODE_FILE="${STATE_DIR}/mode"
PID_FILE="${STATE_DIR}/approve_pid"

# SAFETY ASSERT #1: Never touch the CEO session (belt)
if [[ "$WORKER_SESSION" == "aria" ]]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') FATAL: approve loop would target 'aria' session — aborting" >> "$LOG"
    exit 1
fi
# SAFETY ASSERT #2: Session name must start with "aria-" (suspenders)
if [[ "$WORKER_SESSION" != aria-* ]]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') FATAL: session '$WORKER_SESSION' does not start with 'aria-' — aborting" >> "$LOG"
    exit 1
fi

echo $$ > "$PID_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') Approve loop started for ${WORKER_NAME} (session ${WORKER_SESSION})" >> "$LOG"

# -----------------------------------------------------------------------
# DENY PATTERNS — matched against ANSI-stripped pane content.
#
# DENY_CATASTROPHIC: block even in yolo mode.
# DENY_AUTO: block in auto mode; bypass-able in yolo.
# -----------------------------------------------------------------------

DENY_CATASTROPHIC=(
    "git push --force"
    "git push.*--force"
    "force-push"
    "rm -rf /"
    "rm.*-rf.*/root/aria"
    "rm.*-rf.*/root/projekte"
    "rm.*-rf /root/aria"
    "rm.*-rf /root/projekte"
    "DROP DATABASE"
    "DROP TABLE"
    "truncate.*production"
    "reset.*--hard.*origin/main"
    "reset.*--hard.*origin/master"
)

DENY_AUTO=(
    "git push"
    "gh pr merge"
    "npm publish"
    "yarn publish"
    "pnpm publish"
    "vercel deploy"
    "supabase db push"
    "apply.*migration"
    "migrate.*apply"
    "prisma migrate deploy"
    "prisma db push"
    "kubectl apply"
    "kubectl delete"
    "terraform apply"
    "terraform destroy"
    "ansible-playbook"
    "rm -rf"
    "rmdir"
    "unlink"
    "mv .* /dev/null"
    "wipe"
    "format"
    "mkfs"
    "dd if="
    "DROP "
    "DELETE FROM"
    "TRUNCATE"
    "UPDATE.*SET.*WHERE 1=1"
    "pg_restore"
    "mongorestore"
    "firebase deploy"
    "netlify deploy"
    "aws s3 rm"
    "aws ec2 terminate"
    "gcloud.*delete"
    "secret.*rotate"
    "token.*revoke"
    "credential.*delete"
)

matches_any() {
    local text="$1"
    shift
    local patterns=("$@")
    for pat in "${patterns[@]}"; do
        if echo "$text" | grep -qi "$pat"; then
            return 0
        fi
    done
    return 1
}

while true; do
    sleep 2

    # Exit if session is gone
    if ! tmux has-session -t "$WORKER_SESSION" 2>/dev/null; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') Session ${WORKER_SESSION} gone — loop exiting" >> "$LOG"
        break
    fi

    # Re-read mode every cycle — allows live mode changes without restart (CF-7)
    MODE=$(cat "$MODE_FILE" 2>/dev/null | tr -d '[:space:]')
    case "$MODE" in
        assist|auto|yolo) ;;
        # "off" is rejected here — falls to assist. Panel must not send "off". (CF-7)
        *) MODE="assist" ;;
    esac

    # CF-10: Strip ANSI escape codes before pattern matching
    SCREEN=$(tmux capture-pane -t "$WORKER_SESSION" -p 2>/dev/null \
             | sed 's/\x1b\[[0-9;]*m//g')

    # Check for Claude permission dialog
    HAS_PROCEED=$(echo "$SCREEN" | grep -q "Do you want to proceed" && echo "yes" || echo "no")
    HAS_YES=$(echo "$SCREEN" | grep -q "1\. Yes" && echo "yes" || echo "no")

    if [[ "$HAS_PROCEED" != "yes" || "$HAS_YES" != "yes" ]]; then
        continue
    fi

    # --- ASSIST: never auto-approve ---
    if [[ "$MODE" == "assist" ]]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') [assist] Dialog detected — NOT approving, waiting for human" >> "$LOG"
        continue
    fi

    # --- Check catastrophic denies (block even in yolo) ---
    if matches_any "$SCREEN" "${DENY_CATASTROPHIC[@]}"; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') [${MODE}] CATASTROPHIC pattern matched — BLOCKED, human required" >> "$LOG"
        continue
    fi

    # --- AUTO: also check auto-deny patterns ---
    if [[ "$MODE" == "auto" ]]; then
        if matches_any "$SCREEN" "${DENY_AUTO[@]}"; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') [auto] DENY pattern matched — NOT approving, waiting for human" >> "$LOG"
            continue
        fi
        tmux send-keys -t "$WORKER_SESSION" Enter
        echo "$(date '+%Y-%m-%d %H:%M:%S') [auto] Approved (no deny patterns matched)" >> "$LOG"
        sleep 3
        continue
    fi

    # --- YOLO: catastrophics already blocked above ---
    if [[ "$MODE" == "yolo" ]]; then
        tmux send-keys -t "$WORKER_SESSION" Enter
        echo "$(date '+%Y-%m-%d %H:%M:%S') [yolo] Approved" >> "$LOG"
        sleep 3
        continue
    fi
done

rm -f "$PID_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') Approve loop exited cleanly for ${WORKER_NAME}" >> "$LOG"
