#!/bin/sh
set -eu

LOCKFILE="${OPENCODE_ATTACH_LOCK:-/tmp/opencode-attach.lock}"

: "${OPENCODE_SERVER_PASSWORD:?OPENCODE_SERVER_PASSWORD is required}"
: "${OPENCODE_API_URL:?OPENCODE_API_URL is required}"

cleanup_lock() {
    if [ -f "$LOCKFILE" ]; then
        existing_pid=$(cat "$LOCKFILE" 2>/dev/null || true)
        [ "$existing_pid" = "$$" ] && rm -f "$LOCKFILE"
    fi
}

kill_existing_instance() {
    if [ ! -f "$LOCKFILE" ]; then
        return
    fi

    existing_pid=$(cat "$LOCKFILE" 2>/dev/null || true)
    if [ -z "$existing_pid" ] || [ "$existing_pid" = "$$" ]; then
        rm -f "$LOCKFILE"
        return
    fi

    if kill -0 "$existing_pid" 2>/dev/null; then
        kill "$existing_pid" 2>/dev/null
        for _ in 1 2 3 4 5; do
            if ! kill -0 "$existing_pid" 2>/dev/null; then
                break
            fi
            sleep 1
        done
        if kill -0 "$existing_pid" 2>/dev/null; then
            kill -9 "$existing_pid" 2>/dev/null || true
        fi
    fi

    rm -f "$LOCKFILE"
}

trap cleanup_lock INT TERM EXIT

kill_existing_instance
printf '%s\n' "$$" > "$LOCKFILE"

exec opencode attach -p "${OPENCODE_SERVER_PASSWORD}" "${OPENCODE_API_URL}" "$@"
