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

usage() {
  cat <<'EOF'
Usage:
  pi-job-start --cwd PATH --prompt TEXT [--name SLUG] [--runtime-root DIR]
  pi-job-start --cwd PATH --prompt-file FILE [--name SLUG] [--runtime-root DIR]
EOF
}

slugify() {
  printf '%s' "$1" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-+/-/g'
}

CWD=""
PROMPT=""
PROMPT_FILE=""
NAME="job"
RUNTIME_ROOT="${PI_JOB_ROOT:-/home/sebas/runtime/pi-jobs}"

while [[ $# -gt 0 ]]; do
  case "$1" in
    --cwd) CWD="$2"; shift 2 ;;
    --prompt) PROMPT="$2"; shift 2 ;;
    --prompt-file) PROMPT_FILE="$2"; shift 2 ;;
    --name) NAME="$2"; shift 2 ;;
    --runtime-root) RUNTIME_ROOT="$2"; shift 2 ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Unknown arg: $1" >&2; usage >&2; exit 1 ;;
  esac
done

if [[ -z "$CWD" ]]; then
  echo "--cwd required" >&2
  exit 1
fi
if [[ -n "$PROMPT" && -n "$PROMPT_FILE" ]]; then
  echo "Use either --prompt or --prompt-file, not both" >&2
  exit 1
fi
if [[ -z "$PROMPT" && -z "$PROMPT_FILE" ]]; then
  echo "Prompt required" >&2
  exit 1
fi
if [[ ! -d "$CWD" ]]; then
  echo "cwd not found: $CWD" >&2
  exit 1
fi
if [[ -n "$PROMPT_FILE" && ! -f "$PROMPT_FILE" ]]; then
  echo "prompt file not found: $PROMPT_FILE" >&2
  exit 1
fi

mkdir -p "$RUNTIME_ROOT/jobs"
STAMP="$(date -u +%Y%m%dT%H%M%SZ)"
SLUG="$(slugify "$NAME")"
[[ -n "$SLUG" ]] || SLUG="job"
JOB_ID="$STAMP-$SLUG"
JOB_DIR="$RUNTIME_ROOT/jobs/$JOB_ID"
mkdir -p "$JOB_DIR"
STARTED_AT_MS="$(python - <<'PY'
import time
print(int(time.time()*1000))
PY
)"
TOOL_USAGE_LOG="$(cd "$(dirname "$0")" && pwd)/tool-usage-log"

CWD_ABS="$(cd "$CWD" && pwd)"
RUNNER_PATH="$(cd "$(dirname "$0")" && pwd)/pi-job-runner"

cat > "$JOB_DIR/meta.env" <<EOF
JOB_ID='$JOB_ID'
CWD='$CWD_ABS'
RUNTIME_ROOT='$RUNTIME_ROOT'
JOB_DIR='$JOB_DIR'
STARTED_AT_MS='$STARTED_AT_MS'
TOOL_USAGE_LOG='$TOOL_USAGE_LOG'
EOF

if [[ -n "$PROMPT_FILE" ]]; then
  cp "$PROMPT_FILE" "$JOB_DIR/prompt.txt"
else
  printf '%s\n' "$PROMPT" > "$JOB_DIR/prompt.txt"
fi

printf 'queued\n' > "$JOB_DIR/status"
: > "$JOB_DIR/output.log"
rm -f "$JOB_DIR/pid" "$JOB_DIR/exit_code" "$JOB_DIR/started_at" "$JOB_DIR/finished_at"
"$TOOL_USAGE_LOG" started job pi-job-start 0 '' '' "$CWD_ABS" '' "$JOB_ID" || true

nohup "$RUNNER_PATH" "$JOB_DIR" >/dev/null 2>&1 < /dev/null &
PID=$!
printf '%s\n' "$PID" > "$JOB_DIR/pid"

cat <<EOF
job_id=$JOB_ID
cwd=$CWD_ABS
job_dir=$JOB_DIR
log=$JOB_DIR/output.log
status=queued
pid=$PID
EOF
