#!/bin/bash
set -e

SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
PATCH_DIR="$SCRIPT_DIR/"
REPO_ROOT=$(cd "$SCRIPT_DIR/../.." && pwd)
BUILDS_DIR="$REPO_ROOT/.builds"
DBDATA_DIR="$REPO_ROOT/.dbdata"
RESULTS_DIR="$REPO_ROOT/src/test/modules/test_buffer_pin/results"
BENCHMARK_DIR="$REPO_ROOT/src/test/modules/test_buffer_pin"
mkdir -p $BENCHMARK_DIR/results/
PORT=5434

cd "$REPO_ROOT"

#AM_OPTS="--whitespace=nowarn --3way"
AM_OPTS=""

function clean_repo() {
    git reset --hard
#    git clean -fd
}

function build_and_test() {
    local NAME="$1"
    local TITLE="$2"
    local PREFIX="$BUILDS_DIR/$NAME"
    
    echo ""
    echo "============================================================"
    echo "Building: $NAME"
    echo "============================================================"
    
    # Configure and build
    make distclean >/dev/null 2>&1 || true
    ./configure --prefix="$PREFIX" --without-icu --without-readline --without-zlib >/dev/null
    make -j8 -s
    make install -s
    
    # Build and install extension
    cd "$BENCHMARK_DIR"
    make clean -s 2>/dev/null || true
    make PG_CONFIG="$PREFIX/bin/pg_config" USE_PGXS=1 install -s
    cd "$REPO_ROOT"
    
    echo ""
    echo "============================================================"
    echo "Testing: $NAME"
    echo "============================================================"
    
    # Stop any running server
    "$PREFIX/bin/pg_ctl" -D "$DBDATA_DIR" stop 2>/dev/null || true
    sleep 1
    
    # Initialize fresh database
    rm -rf "$DBDATA_DIR"
    "$PREFIX/bin/initdb" -D "$DBDATA_DIR" >/dev/null
    
    # Start server
    "$PREFIX/bin/pg_ctl" -D "$DBDATA_DIR" -l "$REPO_ROOT/logfile_$NAME" -o "-p $PORT" start
    sleep 2
    
    # Run benchmark
    mkdir -p "$RESULTS_DIR"
    cd "$BENCHMARK_DIR"
    python3 benchmark.py --port $PORT --name "$NAME" --title "$TITLE" \
        --max-dist 10000 --points 200 --samples 50 --iterations 20000
    cd "$REPO_ROOT"
    
    # Stop server
    "$PREFIX/bin/pg_ctl" -D "$DBDATA_DIR" stop
    
    echo "Results saved to: $RESULTS_DIR/$NAME.{svg,csv,txt}"
}

# # Master with patches applied incrementally
git checkout -B pins origin/master
# clean_repo

# Then apply each numbered patch and benchmark after each
for patch in "$PATCH_DIR"/*.patch; do
    [ -f "$patch" ] || continue
    
    # Extract patch number (e.g., 0001 -> 1)
    patchnum=$(basename "$patch" | cut -c1-4 | sed 's/^0*//')
    patchname=$(basename "$patch" .patch)
    
    git am $AM_OPTS "$patch"
    build_and_test "patch-$patchnum" "Patch $patchnum: $patchname"
done

echo ""
echo "============================================================"
echo "All benchmarks complete!"
echo "Results in: $RESULTS_DIR/"
echo "============================================================"
