#!/usr/bin/env bash

set -e

CLUSTERS=("1" "2")

ceph() {
    ${FULL_PATH_BUILD_DIR}/../src/mrun 1 ceph $@
}

ceph2() {
    ${FULL_PATH_BUILD_DIR}/../src/mrun 2 ceph $@
}

ceph_all() {
    ceph $@
    ceph2 $@
}

start_ceph() {
    cd $FULL_PATH_BUILD_DIR

    for cluster in ${CLUSTERS[@]}; do
        export CEPH_OUT_CLIENT_DIR=${FULL_PATH_BUILD_DIR}/run/${cluster}/out/client
        MGR=2 RGW=1 ../src/mstart.sh $cluster -n -d
    done

    set -x

    # Create an Object Gateway User
    ceph_all dashboard set-rgw-credentials

    # Set SSL verify to False
    ceph_all dashboard set-rgw-api-ssl-verify False

    # Set test_orchestrator as orch backend
    ceph mgr module enable test_orchestrator
    ceph orch set backend test_orchestrator

    CYPRESS_BASE_URL=""
    retry=0
    while [[ -z "${CYPRESS_BASE_URL}" || "${CYPRESS_BASE_URL}" == "null" ]]; do
        CYPRESS_BASE_URL=$(ceph mgr services | jq -r .dashboard)
        if [ $retry -eq 10 ]; then
            echo "ERROR: Could not get the dashboard URL"
            stop 1
        fi
        retry=$((retry + 1))
        sleep 1
    done
    CYPRESS_CEPH2_URL=$(ceph2 mgr services | jq -r .dashboard)

    # start rbd-mirror daemon in the cluster
    KEY=$(ceph auth get client.admin --format=json | jq -r .[0].key)
    MON_CLUSTER_1=$(grep "mon host" ${FULL_PATH_BUILD_DIR}/run/1/ceph.conf | awk '{print $4}')
    ${FULL_PATH_BUILD_DIR}/bin/rbd-mirror --mon_host $MON_CLUSTER_1 --key $KEY -c ${FULL_PATH_BUILD_DIR}/run/1/ceph.conf

    set +x
}

stop() {
    if [ "$REMOTE" == "false" ]; then
        cd ${FULL_PATH_BUILD_DIR}
        for cluster in ${CLUSTERS[@]}; do
            ../src/mstop.sh $cluster
        done
        pids=$(pgrep rbd-mirror)
        if [ -n "$pids" ]; then
            echo Killing rbd-mirror processes: $pids
            kill -9 $pids
        fi
    fi
    exit $1
}

check_device_available() {
    failed=false

    if [ "$DEVICE" == "docker" ]; then
        [ -x "$(command -v docker)" ] || failed=true
    else
        case "$DEVICE" in
            chrome)
                [ -x "$(command -v chrome)" ] || [ -x "$(command -v google-chrome)" ] ||
                [ -x "$(command -v google-chrome-stable)" ] || failed=true
                ;;
            chromium)
                [ -x "$(command -v chromium)" ] || [ -x "$(command -v chromium-browser)" ] || failed=true
                ;;
        esac
    fi

    if [ "$failed" = "true" ]; then
            echo "ERROR: $DEVICE not found. You need to install $DEVICE or \
    use a different device. Supported devices: chrome (default), chromium, electron or docker."
        stop 1
    fi
}

: ${CYPRESS_BASE_URL:=''}
: ${CYPRESS_CEPH2_URL:=''}
: ${CYPRESS_LOGIN_PWD:=''}
: ${CYPRESS_LOGIN_USER:=''}
: ${DEVICE:="chrome"}
: ${NO_COLOR:=1}
: ${CYPRESS_ARGS:=''}
: ${REMOTE:='false'}

while getopts 'd:p:r:u:' flag; do
  case "${flag}" in
    d) DEVICE=$OPTARG;;
    p) CYPRESS_LOGIN_PWD=$OPTARG;;
    r) REMOTE='true'
       CYPRESS_BASE_URL=$OPTARG;;
    u) CYPRESS_LOGIN_USER=$OPTARG;;
  esac
done

DASH_DIR=`pwd`
[ -z "$BUILD_DIR" ] && BUILD_DIR=build
cd ../../../../${BUILD_DIR}
FULL_PATH_BUILD_DIR=`pwd`

check_device_available

if [ "$CYPRESS_BASE_URL" == "" ]; then
    start_ceph
fi

# node-env is used for all frontend related actions like npm, npx etc.
[[ "$(command -v npm)" == '' ]] && . ${FULL_PATH_BUILD_DIR}/src/pybind/mgr/dashboard/frontend/node-env/bin/activate

: ${CYPRESS_CACHE_FOLDER:="${FULL_PATH_BUILD_DIR}/src/pybind/mgr/dashboard/cypress"}

export CYPRESS_BASE_URL CYPRESS_CACHE_FOLDER CYPRESS_LOGIN_USER CYPRESS_LOGIN_PWD NO_COLOR CYPRESS_CEPH2_URL

# Verify Cypress installation
cd $DASH_DIR/frontend
npx cypress verify

# Remove existing XML results
rm -f cypress/reports/results-*.xml || true

case "$DEVICE" in
    docker)
        failed=0
        CYPRESS_VERSION=$(cat package.json | grep '"cypress"' | grep -o "[0-9]\.[0-9]\.[0-9]")
        docker run \
            -v $(pwd):/e2e \
            -w /e2e \
            --env CYPRESS_BASE_URL \
            --env CYPRESS_LOGIN_USER \
            --env CYPRESS_LOGIN_PWD \
            --env CYPRESS_CEPH2_URL \
            --name=e2e \
            --network=host \
            cypress/included:${CYPRESS_VERSION} || failed=1
        stop $failed
        ;;
    *)
        npx cypress run $CYPRESS_ARGS --browser $DEVICE --headless || stop 1
        ;;
esac

stop 0
