#!/usr/bin/env bash

umask 077

ROOT="${FBTERM_ROOT:?FBTERM_ROOT no definido}"

# R2: mientras fbterm-run esta activo, el pane no esta disponible.
rm -f "$ROOT/prompt.ready"
JOB_ID="${1:-}"

case "$JOB_ID" in
    ''|*[!A-Za-z0-9._-]*)
        printf 'FBTERM_ERROR=INVALID_JOB_ID\n' >&2
        exit 64
        ;;
esac

JOB="$ROOT/jobs/$JOB_ID"
CMD="$JOB/command.bash"
TIMEOUT_FILE="$JOB/timeout.seconds"

if [ ! -f "$CMD" ]; then
    printf 'FBTERM_ERROR=COMMAND_NOT_FOUND JOB_ID=%s\n' "$JOB_ID" >&2
    exit 66
fi

TIMEOUT_S='120'

if [ -f "$TIMEOUT_FILE" ]; then
    VALUE="$(cat "$TIMEOUT_FILE" 2>/dev/null || true)"
    case "$VALUE" in
        ''|*[!0-9]*)
            ;;
        *)
            if [ "$VALUE" -ge 1 ] 2>/dev/null &&
               [ "$VALUE" -le 3600 ] 2>/dev/null
            then
                TIMEOUT_S="$VALUE"
            fi
            ;;
    esac
fi

OUT_FIFO="$JOB/stdout.fifo"
ERR_FIFO="$JOB/stderr.fifo"

STDOUT="$JOB/stdout.bin"
STDERR="$JOB/stderr.bin"

rm -f "$OUT_FIFO" "$ERR_FIFO"

mkfifo "$OUT_FIFO" "$ERR_FIFO"

: > "$STDOUT"
: > "$STDERR"

date -Ins > "$JOB/started.at"

sha256sum "$CMD" |
    awk '{print $1}' > "$JOB/command.sha256"

tee "$STDOUT" < "$OUT_FIFO" &
OUT_TEE_PID=$!

tee "$STDERR" < "$ERR_FIFO" >&2 &
ERR_TEE_PID=$!

/usr/bin/timeout \
    --signal=TERM \
    --kill-after=2s \
    "${TIMEOUT_S}s" \
    bash --noprofile --norc "$CMD" \
    > "$OUT_FIFO" \
    2> "$ERR_FIFO"

RC=$?

wait "$OUT_TEE_PID"
OUT_TEE_RC=$?

wait "$ERR_TEE_PID"
ERR_TEE_RC=$?

printf '%s\n' "$RC" > "$JOB/exit.code"
printf '%s\n' "$OUT_TEE_RC" > "$JOB/stdout-tee.exit"
printf '%s\n' "$ERR_TEE_RC" > "$JOB/stderr-tee.exit"

sha256sum "$STDOUT" |
    awk '{print $1}' > "$JOB/stdout.sha256"

sha256sum "$STDERR" |
    awk '{print $1}' > "$JOB/stderr.sha256"

stat -c '%s' "$STDOUT" > "$JOB/stdout.bytes"
stat -c '%s' "$STDERR" > "$JOB/stderr.bytes"

date -Ins > "$JOB/finished.at"

{
    printf 'JOB_ID=%s\n' "$JOB_ID"
    printf 'EXIT=%s\n' "$RC"
    printf 'COMMAND_SHA256=%s\n' \
        "$(cat "$JOB/command.sha256")"
    printf 'STDOUT_SHA256=%s\n' \
        "$(cat "$JOB/stdout.sha256")"
    printf 'STDERR_SHA256=%s\n' \
        "$(cat "$JOB/stderr.sha256")"
    printf 'STDOUT_BYTES=%s\n' \
        "$(cat "$JOB/stdout.bytes")"
    printf 'STDERR_BYTES=%s\n' \
        "$(cat "$JOB/stderr.bytes")"
    printf 'STDOUT_TEE_EXIT=%s\n' "$OUT_TEE_RC"
    printf 'STDERR_TEE_EXIT=%s\n' "$ERR_TEE_RC"
} > "$JOB/result.tmp"

mv "$JOB/result.tmp" "$JOB/result.env"
touch "$JOB/DONE"

rm -f "$OUT_FIFO" "$ERR_FIFO"

printf 'FBTERM_JOB_COMPLETE JOB_ID=%s EXIT=%s\n' \
    "$JOB_ID" "$RC"

exit "$RC"
