#!/bin/bash
set -eu

PD_BRANCH=$PD_BRANCH
TIKV_BRANCH=$TIKV_BRANCH
TIDB_REPO_PATH=$TIDB_REPO_PATH
PLUGIN_REPO_PATH=$PLUGIN_REPO_PATH
FILE_SERVER_URL=${FILE_SERVER_URL:-"http://fileserver.pingcap.net"}

WORK_DIR=$(pwd)
SCRIPT_DIR=$(dirname -- "$0")
TIKV_BIN_PATH="$WORK_DIR/bin/tikv-server"
PD_BIN_PATH="$WORK_DIR/bin/pd-server"
PLUGIN_CMD_BIN_PATH="$WORK_DIR/bin/pluginpkg"
PLUGIN_TEST_BIN_PATH="$WORK_DIR/bin/plugintest"

echo "download tikv and pd binary"
"$SCRIPT_DIR/download-dependency-binary.sh" "$PD_BRANCH" "$TIKV_BRANCH" "$FILE_SERVER_URL"

echo "build tidb"
cd "$TIDB_REPO_PATH"
go mod tidy
make server
TIDB_BIN_PATH="$TIDB_REPO_PATH/bin/tidb-server"

echo "build pluginpkg"
cd "$TIDB_REPO_PATH"
CGO_ENABLED=1 GO111MODULE=on go build -o "$PLUGIN_CMD_BIN_PATH" cmd/pluginpkg/pluginpkg.go

echo "build audit plugin"
cd "$PLUGIN_REPO_PATH/audit"
go mod tidy
$PLUGIN_CMD_BIN_PATH -pkg-dir . -out-dir .

echo "build audit test"
cd "$PLUGIN_REPO_PATH/test"
go mod tidy
go test -o "$PLUGIN_TEST_BIN_PATH" -c

cd "$WORK_DIR"

echo "start PD ..."
PD_DATA_DIR="$WORK_DIR/pd"
rm -rf "$PD_DATA_DIR"
mkdir -p "$PD_DATA_DIR"
$PD_BIN_PATH --data-dir "$PD_DATA_DIR" \
  --peer-urls=http://127.0.0.1:12380 \
  --advertise-peer-urls=http://127.0.0.1:12380 \
  --client-urls=http://127.0.0.1:12379 \
  --advertise-client-urls=http://127.0.0.1:12379  > "$WORK_DIR/pd.log" 2>&1 & PD_PID=$!
sleep 1
ps -p "$PD_PID" || (echo "pd-server(PID: $PD_PID) exited"; exit 1)
echo "pd-server(PID: $PD_PID) started"
PID_LIST="$PD_PID"
trap 'echo "stop PID $PID_LIST"; kill -9 $PID_LIST || true' EXIT

echo "start TiKV ..."
TIKV_DATA_DIR="$WORK_DIR/tikv"
rm -rf "$TIKV_DATA_DIR"
mkdir "$TIKV_DATA_DIR"
$TIKV_BIN_PATH --data-dir "$TIKV_DATA_DIR" \
  --addr=127.0.0.1:30160 \
  --advertise-addr=127.0.0.1:30160 \
  --status-addr=127.0.0.1:30180 \
  --pd=http://127.0.0.1:12379 > "$WORK_DIR/tikv.log" 2>&1 & TIKV_PID=$!
sleep 1
ps -p "$TIKV_PID" || (echo "tikv-server(PID: $TIKV_PID) exited"; exit 1)
echo "tikv-server(PID: $TIKV_PID) started"
PID_LIST="$PID_LIST $TIKV_PID"
sleep 5

echo "start TiDB ..."
for retry in {0..5}
do
  rm -rf "$WORK_DIR/tidb.log"
  rm -rf "$WORK_DIR/tidb-audit.log"
  $TIDB_BIN_PATH -P 5000 \
    --store=tikv \
    --host=127.0.0.1 \
    --status=20080 \
    --log-slow-query="$WORK_DIR/slowlog.log" \
    --path=127.0.0.1:12379 \
    --plugin-dir="$PLUGIN_REPO_PATH/audit" \
    --plugin-load=audit-1 > "$WORK_DIR/tidb.log" 2>&1 & TIDB_PID=$!
    sleep 5
    ps -p $TIDB_PID && break
    echo "tidb-server(PID: $TIDB_PID) is down($retry)"
    TIDB_PID=''
done

if [ -z "$TIDB_PID" ]; then
    echo "start tidb-server failed"
    grep "\[FATAL\]" "$WORK_DIR/tidb.log"
    exit 1
fi

echo "tidb-server(PID: $TIDB_PID) started"
PID_LIST="$PID_LIST $TIDB_PID"

sleep 5
echo "start run test ..."
TIDB_ADDR="127.0.0.1:5000" AUDIT_PATH="$WORK_DIR/tidb-audit.log" $PLUGIN_TEST_BIN_PATH || grep "\[FATAL\]" "$WORK_DIR/tidb.log" || exit 1
echo "test end"
