#!/usr/bin/env bash
# scripts/qa/phpunit - Run PHPUnit test suite in Docker
set -euo pipefail

# Configuration
# Robust script and project root discovery
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
    DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
SCRIPT_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
DB_BACKUP_FILE="$PROJECT_ROOT/tests/cache/auc-14-5-test.fbk"
FIREBIRD_CONTAINER="dev-satag-amicron-entity-bundle-firebird-server"
APP_CONTAINER="dev-satag-amicron-entity-bundle-app-server"
FIREBIRD_BACKUP_PATH="/tmp/auc-14-5-test.fbk"
DBNAME="/var/lib/firebird/data/auc-test.fdb"
DBUSER="sysdba"
DBPASSWORD="masterkey"

# Default options
SKIP_RESTORE=false
USE_COVERAGE=true

# Help message
show_help() {
    echo "Usage: $0 [options] [--] [phpunit-arguments]"
    echo ""
    echo "Options:"
    echo "  -h, --help           Show this help message"
    echo "  -s, --skip-restore   Skip database restoration and VARCHAR expansion"
    echo "  -n, --no-coverage    Disable code coverage (faster)"
    echo ""
    echo "Example:"
    echo "  $0 --filter MyTestClass"
    echo "  $0 -s --testsuite Unit"
    exit 0
}

# Parse arguments
PHPUNIT_ARGS=()
while [[ $# -gt 0 ]]; do
    case "$1" in
        -h|--help)
            show_help
            ;;
        -s|--skip-restore)
            SKIP_RESTORE=true
            shift
            ;;
        -n|--no-coverage)
            USE_COVERAGE=false
            shift
            ;;
        --)
            shift
            PHPUNIT_ARGS+=("$@")
            break
            ;;
        *)
            PHPUNIT_ARGS+=("$1")
            shift
            ;;
    esac
done

# Ensure containers are running
if ! docker ps --format '{{.Names}}' | grep -q "$APP_CONTAINER"; then
    echo "Error: Container $APP_CONTAINER is not running."
    echo "Try: docker compose up -d"
    exit 1
fi

if [[ "$SKIP_RESTORE" == "false" ]]; then
    # Create cache directory if needed
    mkdir -p "$PROJECT_ROOT/tests/cache"

    # Download backup if missing or older than 24 hours
    if [[ ! -f "$DB_BACKUP_FILE" ]] || [[ $(find "$DB_BACKUP_FILE" -mtime +1 2>/dev/null) ]]; then
        echo "Downloading test database backup..."
        curl -sL "https://data.satware.com/s/5zTP4DgqnBFZy2A/download" -o "$DB_BACKUP_FILE"
    fi

    # Restore database
    echo "Copying backup to firebird container..."
    docker cp "$DB_BACKUP_FILE" "$FIREBIRD_CONTAINER:$FIREBIRD_BACKUP_PATH"

    echo "Restoring test database..."
    docker exec "$FIREBIRD_CONTAINER" gbak -REP \
        -user "$DBUSER" \
        -password "$DBPASSWORD" \
        "$FIREBIRD_BACKUP_PATH" \
        "$DBNAME"

    echo "Cleaning up temporary backup..."
    docker exec "$FIREBIRD_CONTAINER" rm -f "$FIREBIRD_BACKUP_PATH"

    # Apply VARCHAR expansion
    SQL_SCRIPT="$PROJECT_ROOT/scripts/db/extend-varchar-columns.sql"
    if [[ -f "$SQL_SCRIPT" ]]; then
        echo "Applying VARCHAR expansion..."
        # Note: This relies on the implicit DDL auto-commit behavior of Firebird.
        # `isql` auto-commits DDL statements implicitly to release metadata locks.
        docker exec -i "$FIREBIRD_CONTAINER" /opt/firebird/bin/isql \
            -user "$DBUSER" \
            -password "$DBPASSWORD" \
            "$DBNAME" < "$SQL_SCRIPT"
        echo "VARCHAR expansion complete."
    fi
    echo ""
else
    echo "Skipping database restore (manually disabled)."
fi

# Determine coverage settings
XDEBUG_MODE="off"
COVERAGE_EXTRA_ARGS=""
if [[ "$USE_COVERAGE" == "true" ]]; then
    # PCOV is used for coverage (installed in Dockerfile)
    XDEBUG_MODE="off"
    COVERAGE_EXTRA_ARGS=""
else
    XDEBUG_MODE="off"
    # Disable PCOV when coverage is not requested
    COVERAGE_EXTRA_ARGS="-dpcov.enabled=0 --no-coverage"
fi

# Run PHPUnit
echo "Running PHPUnit tests..."
docker compose exec -T --user=application -w /app app_server \
    env SKIP_DB_RESTORE=1 XDEBUG_MODE="$XDEBUG_MODE" php ./vendor/bin/phpunit $COVERAGE_EXTRA_ARGS "${PHPUNIT_ARGS[@]}"
