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

CLIENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$CLIENT_DIR/../.." && pwd)"

IMAGE_NAME="${DEPI_TEST_IMAGE:-depi-server-test}"
CONTAINER_NAME="${DEPI_TEST_CONTAINER:-depi-server-test}"
DEPI_PORT="${DEPI_TEST_PORT:-5150}"
NODE_TEST_IMAGE="${NODE_TEST_IMAGE:-node:22-bookworm}"
DEPI_URL="${DEPI_URL:-127.0.0.1:${DEPI_PORT}}"

started_container=false

cleanup() {
    if [ "$started_container" = true ]; then
        docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true
    fi
}
trap cleanup EXIT

run_jest() {
    export DEPI_URL
    npm run test:jest
}

run_jest_in_dind() {
    # DinD: the job container cannot reach ports on the inner daemon bridge.
    # Run Jest in a sibling container that shares depi-server's network namespace.
    echo "depi-server at 127.0.0.1:${DEPI_PORT} (shared container network)"
    docker run --rm \
        --network "container:${CONTAINER_NAME}" \
        -v "$REPO_ROOT:/repo" \
        -w /repo/clients/node-client \
        -e "DEPI_URL=127.0.0.1:${DEPI_PORT}" \
        "$NODE_TEST_IMAGE" \
        bash -c "npm ci && npm run build && npm run test:jest"
}

run_jest_in_node_image() {
    echo "depi-server at ${DEPI_URL} (host network)"
    if [ "$NODE_TEST_IMAGE" = "node:22-bookworm" ]; then
        docker run --rm \
            --network host \
            -v "$REPO_ROOT:/repo" \
            -w /repo/clients/node-client \
            -e "DEPI_URL=${DEPI_URL}" \
            "$NODE_TEST_IMAGE" \
            bash -c "npm ci && npm run build && npm run test:jest"
    else
        docker run --rm \
            --network host \
            -e "DEPI_URL=${DEPI_URL}" \
            "$NODE_TEST_IMAGE" \
            npm run test:jest
    fi
}

is_dind() {
    [ "${DOCKER_HOST:-}" = "tcp://docker:2376" ]
}

cd "$CLIENT_DIR"

if [ "${DEPI_SKIP_DOCKER:-}" != "1" ]; then
    if ! command -v docker >/dev/null 2>&1; then
        echo "docker is required unless DEPI_SKIP_DOCKER=1 is set" >&2
        exit 1
    fi

    docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true
    if ! docker image inspect "$IMAGE_NAME" >/dev/null 2>&1; then
        docker build -t "$IMAGE_NAME" "$REPO_ROOT"
    fi

    if [ -n "${CI:-}" ]; then
        if is_dind; then
            docker run -d --name "$CONTAINER_NAME" "$IMAGE_NAME" >/dev/null
            started_container=true
            run_jest_in_dind
        else
            docker run -d --name "$CONTAINER_NAME" -p "${DEPI_PORT}:5150" "$IMAGE_NAME" >/dev/null
            started_container=true
            DEPI_URL="127.0.0.1:${DEPI_PORT}"
            run_jest_in_node_image
        fi
        exit 0
    fi

    docker run -d --name "$CONTAINER_NAME" -p "${DEPI_PORT}:5150" "$IMAGE_NAME" >/dev/null
    started_container=true
    DEPI_URL="127.0.0.1:${DEPI_PORT}"
    echo "depi-server at ${DEPI_URL}"
fi

if [ ! -d node_modules ]; then
    npm ci
fi

npm run build
run_jest
