#!/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/amicron-demo.fbk"
FIREBIRD_CONTAINER="dev-satag-amicron-entity-bundle-firebird-server"
APP_CONTAINER="dev-satag-amicron-entity-bundle-app-server"
FIREBIRD_BACKUP_PATH="/tmp/amicron-demo.fbk"
DBNAME="/var/lib/firebird/data/amicron-test"
DBUSER="sysdba"
DBPASSWORD="masterkey"
DEMO_BACKUP_SHA256="92b78ac2415ed1598845e43af1be9358c173bf5274d64460bd3da6b9e436ec53"
SIBLING_BACKUP="$HOME/internal/amicron-firebird/backups/amicron-demo.fbk"
DOWNLOAD_URL="https://data.satware.com/s/mSnX9wiZwWpkDjc/download"

# 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"
    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 stale: copy from sibling amicron-firebird, or download from Nextcloud
    if [[ ! -f "$DB_BACKUP_FILE" ]] || [[ $(find "$DB_BACKUP_FILE" -mtime +1 2>/dev/null) ]]; then
        echo "Fetching test database backup..."
        if [[ -f "$SIBLING_BACKUP" ]]; then
            echo "  Copying from sibling amicron-firebird..."
            cp "$SIBLING_BACKUP" "$DB_BACKUP_FILE"
        else
            echo "  Sibling backup not found at $SIBLING_BACKUP"
            echo "  Downloading from $DOWNLOAD_URL ..."
            if ! curl -fSL "$DOWNLOAD_URL" -o "$DB_BACKUP_FILE"; then
                echo "Error: Failed to download backup from $DOWNLOAD_URL" >&2
                echo "To use local sibling: cd ~/internal/amicron-firebird && ./scripts/db-manager.sh backup amicron-demo.fdb" >&2
                exit 1
            fi
        fi
    fi

    # Verify backup integrity (enforced - a stale/corrupted backup gives false test results)
    echo "Verifying backup SHA256..."
    if ! echo "$DEMO_BACKUP_SHA256  $DB_BACKUP_FILE" | sha256sum -c --quiet 2>/dev/null; then
        echo "Error: Backup SHA256 mismatch. Expected $DEMO_BACKUP_SHA256" >&2
        echo "The backup may have been updated in amicron-firebird." >&2
        echo "If intentional, update DEMO_BACKUP_SHA256 in bin/phpunit." >&2
        exit 1
    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"

    # Note: VARCHAR expansion (extend-varchar-columns.sql) is no longer needed.
    # The amicron-test database (restored from amicron-demo.fbk) already has VARCHAR(255) FREIFELD columns.
    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"
    COVERAGE_EXTRA_ARGS="--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[@]}"
