#!/bin/bash
set -euo pipefail

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

# Variables for cleanup
COMPOSE_FILE="${SCRIPT_DIR}/compose.yaml"
CLEANUP_NEEDED=false

# FUNCTIONS
function title() {
    echo "----------------------------------------"
    # Center the text
    local text="$1"
    local line_length=40
    local text_length=${#text}
    local padding=$(( (line_length - text_length) / 2 ))
    printf "%*s%s%*s\n" $padding "" "$text" $padding ""
    echo "----------------------------------------"
}   

function cleanup() {
    if [ "$CLEANUP_NEEDED" = true ]; then
        echo ""
        title "Cleaning up containers"
        
        # Stop and remove the test container
        docker stop sos-test 2>/dev/null || true
        docker rm -v sos-test 2>/dev/null || true
        
        # Use docker compose to clean up
        if [ -f "${COMPOSE_FILE}" ]; then
            docker compose -f "${COMPOSE_FILE}" down 2>/dev/null || true
            docker compose -f "${COMPOSE_FILE}" rm -v -f 2>/dev/null || true
        fi
        
        echo "Cleanup completed"
    fi
}

function die() {
    title "error: $1"
    cleanup
    exit 1
}

# Set up trap to ensure cleanup on exit
trap cleanup EXIT INT TERM

function wait_for_container {
    container_id="$1"
    container_name="$(docker inspect "${container_id}" --format '{{ .Name }}')"
    echo "Waiting for container: ${container_name} [${container_id}]"
    waiting_done="false"
    while [[ "${waiting_done}" != "true" ]]; do
        container_state="$(docker inspect "${container_id}" --format '{{ .State.Status }}')"
        if [[ "${container_state}" == "running" ]]; then
            health_status="$(docker inspect "${container_id}" --format '{{ .State.Health.Status }}')"
            echo "${container_name}: container_state=${container_state}, health_status=${health_status}"
            if [[ ${health_status} == "healthy" ]]; then
                waiting_done="true"
            fi
        else
            echo "${container_name}: container_state=${container_state}"
            health_status="${container_state}"
            waiting_done="true"
        fi
        sleep 1;
    done;
    [ "${health_status}" == "healthy" ]
}


title "Building"
"${SCRIPT_DIR}/../build.sh" || die "Build failed"


#------------------------------------------------------------------------------------------------
# Use static test configuration with known tokens for Docker testing
title "Setting up test configuration"
# Use the static Docker config with known hashes
cp "${SCRIPT_DIR}/sos_config_docker.json" "${SCRIPT_DIR}/sos_config.json"

# Export the known plaintext tokens that correspond to the hashes in sos_config_docker.json
export TEST_TOKEN1="t570H7DmK2VBfCwUmtFaUXyzVklL90E1"
export TEST_TOKEN2="U3x9V39Y7rjXdRK0oxZsCz5lD6jFFDtm"
export TEST_TOKEN3="UhtchhGDEGXlJ37GumimFtPe0imjAvak"

echo "Using static test configuration with known tokens"

#------------------------------------------------------------------------------------------------
# run the docker container
title "Running docker container"

# Config file is always in SCRIPT_DIR after the copy above
LOCALCONFIG="${SCRIPT_DIR}/sos_config.json"

[ -f "${LOCALCONFIG}" ] || die "Config file not found: ${LOCALCONFIG}"
[ -f "${COMPOSE_FILE}" ] || die "Compose file not found: ${COMPOSE_FILE}"

#------------------------------------------------------------------------------------------------
title "Running tests"

PREV_DIR=$(pwd)
cd "${SCRIPT_DIR}"

# Clean up any existing containers before starting
docker stop sos-test 2>/dev/null || true
docker rm -v sos-test 2>/dev/null || true

# Start the container (without config volume mount)
docker compose -f "${COMPOSE_FILE}" up -d

# Mark that we need cleanup from this point on
CLEANUP_NEEDED=true

# Copy the config file into the running container
echo "Copying config file into container..."
docker cp "${LOCALCONFIG}" sos-test:/testing/sos_config.json

# wait until healthy.
if ! wait_for_container "sos-test"; then
    echo "----------------------------------------"
    echo "Container sos-test is not healthy"
    echo "----------------------------------------"
    docker logs sos-test
    die "Container sos-test is not healthy"
fi

# Verify the config and test files are accessible
echo "Verifying test environment..."
docker exec sos-test ls -la /testing/ || die "Cannot access /testing directory in container"

# Run the tests inside the container
echo "Running tests inside container..."
docker exec -i \
    -e TEST_TOKEN1="${TEST_TOKEN1:-}" \
    -e TEST_TOKEN2="${TEST_TOKEN2:-}" \
    -e TEST_TOKEN3="${TEST_TOKEN3:-}" \
    sos-test /bin/bash -c "cd /testing && ./test.sh http://127.0.0.1:7703"
RESULT=$?

cd "${PREV_DIR}"

# Cleanup will be handled by the trap
exit $RESULT
