#!/usr/bin/env bash

set -exuo pipefail

SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE[0]});pwd)
source "${SCRIPT_DIR}/common.sh"

declare -a E2E_SCRIPT_TIMING_SUMMARY=()
E2E_SCRIPT_START_SECONDS=${SECONDS}
E2E_SCRIPT_SUMMARY_PRINTED=0

record_e2e_script_timing() {
    local name=$1
    local detail=$2

    E2E_SCRIPT_TIMING_SUMMARY+=("${name}|${detail}")
}

run_timed_e2e_stage() {
    local name=$1
    shift
    local start_seconds=${SECONDS}

    if "$@"; then
        record_e2e_script_timing "${name}" "$((SECONDS - start_seconds))s"
        return 0
    fi

    local status=$?
    record_e2e_script_timing "${name}" "failed after $((SECONDS - start_seconds))s (status=${status})"
    return "${status}"
}

print_e2e_script_timing_summary() {
    local item
    local name
    local detail

    if [ "${E2E_SCRIPT_SUMMARY_PRINTED}" -eq 1 ]; then
        return 0
    fi

    E2E_SCRIPT_SUMMARY_PRINTED=1
    echo "E2E SCRIPT TIMING SUMMARY (${PLAYGROUND_TAG:-unknown})"
    for item in "${E2E_SCRIPT_TIMING_SUMMARY[@]}"; do
        name=${item%%|*}
        detail=${item#*|}
        echo "  ${name}: ${detail}"
    done
    echo "  total: $((SECONDS - E2E_SCRIPT_START_SECONDS))s"
}

usage() {
    echo "Usage: $0 --tag <TAG> [--test-path <PATH>] [--prepare-env <ENV_VARS>] [--install-boto3] [--skip-bootstrap]"
    echo ""
    echo "Options:"
    echo "  --tag              Playground tag (required)"
    echo "  --test-path        Test directory or file to run (default: tests/test-cases)"
    echo "  --prepare-env      Environment variables for e2e-prepare.sh (optional)"
    echo "  --install-boto3    Install boto3 package (optional)"
    echo "  --skip-bootstrap   Skip one-time e2e-bootstrap.sh (optional)"
    echo ""
    echo "Environment:"
    echo "  E2E_TEST_RUNNER_ARGS  Extra args appended to tests/tools/test_runner.py, e.g. '--parallel 2' (default: --parallel 4)"
    echo ""
    echo "Example:"
    echo "  $0 --tag multi-readers --test-path tests/test-cases/multi-config --prepare-env 'TICI_META_CONFIG=... TICI_READER_COUNT=2'"
    echo "  $0 --tag default --install-boto3 --test-path tests/test-cases/default-only"
    exit 1
}

# Default values
INSTALL_BOTO3=false
PREPARE_ENV=""
SKIP_BOOTSTRAP=false
TEST_PATH="tests/test-cases"

# Parse arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        --tag)
            PLAYGROUND_TAG="$2"
            shift 2
            ;;
        --test-path)
            TEST_PATH="$2"
            shift 2
            ;;
        --prepare-env)
            PREPARE_ENV="$2"
            shift 2
            ;;
        --install-boto3)
            INSTALL_BOTO3=true
            shift
            ;;
        --skip-bootstrap)
            SKIP_BOOTSTRAP=true
            shift
            ;;
        -h|--help)
            usage
            ;;
        *)
            echo "Unknown option: $1"
            usage
            ;;
    esac
done

# Check required arguments
if [ -z "${PLAYGROUND_TAG:-}" ]; then
    echo "Error: --tag is required"
    usage
fi

export PLAYGROUND_TAG

run_e2e_prepare() {
    echo "Running e2e prepare with tag: $PLAYGROUND_TAG"
    if [ -n "$PREPARE_ENV" ]; then
        echo "Using environment variables: $PREPARE_ENV"
        eval "$PREPARE_ENV bash \"${PROJECT_ROOT}/tests/scripts/e2e-prepare.sh\""
    else
        bash "${PROJECT_ROOT}/tests/scripts/e2e-prepare.sh"
    fi
}

run_dependency_checks() {
    if [ "$INSTALL_BOTO3" = true ]; then
        python3 -c "import boto3" 2>/dev/null || pip3 install boto3
    fi

    python3 -c "import dataclasses" 2>/dev/null || pip3 install dataclasses
}

on_e2e_script_exit() {
    local exit_code=$?

    set +e
    run_timed_e2e_stage "dump logs" dump_logs
    run_timed_e2e_stage "cleanup" cleanup
    print_e2e_script_timing_summary
    exit "${exit_code}"
}

trap 'on_e2e_script_exit' EXIT

# Run one-time bootstrap unless the caller already handled it.
if [ "$SKIP_BOOTSTRAP" = false ]; then
    echo "Running e2e bootstrap"
    run_timed_e2e_stage "bootstrap" bash "${PROJECT_ROOT}/tests/scripts/e2e-bootstrap.sh"
else
    record_e2e_script_timing "bootstrap" "skipped"
fi

run_timed_e2e_stage "prepare" run_e2e_prepare
run_timed_e2e_stage "dump configs" dump_configs
run_timed_e2e_stage "dependency checks" run_dependency_checks

cd "${PROJECT_ROOT}"

# Run tests
declare -a EXTRA_TEST_RUNNER_ARGS=()
if [ -n "${E2E_TEST_RUNNER_ARGS:-}" ]; then
    # Split in the same simple word form used by make/sudo environment overrides.
    EXTRA_TEST_RUNNER_ARGS=(${E2E_TEST_RUNNER_ARGS})
    echo "Using extra test runner args: ${EXTRA_TEST_RUNNER_ARGS[*]}"

    run_timed_e2e_stage "test runner" python3 tests/tools/test_runner.py "$TEST_PATH" \
        --database test \
        --s3-endpoint localhost:9000 \
        --s3-bucket ticidefaultbucket \
        --s3-prefix "$PLAYGROUND_TAG" \
        "${EXTRA_TEST_RUNNER_ARGS[@]}"
else
    run_timed_e2e_stage "test runner" python3 tests/tools/test_runner.py "$TEST_PATH" \
        --database test \
        --s3-endpoint localhost:9000 \
        --s3-bucket ticidefaultbucket \
        --s3-prefix "$PLAYGROUND_TAG"
fi
