#!/bin/bash

get_db_config(){
  if test -f "/var/gerrit/etc/secure.config"; then
    export DB_USER=$(git config --file /var/gerrit/etc/secure.config --get database.username)
    export DB_PASSWORD=$(git config --file /var/gerrit/etc/secure.config --get database.password)
  fi

  if test -f "/var/gerrit/etc/gerrit.config"; then
    export DB_TYPE=$(git config --file /var/gerrit/etc/gerrit.config --get database.type)
    export DB_NAME=$(git config --file /var/gerrit/etc/gerrit.config --get database.database)
    export DB_HOST=$(git config --file /var/gerrit/etc/gerrit.config --get database.hostname)
    export DB_PORT=$(git config --file /var/gerrit/etc/gerrit.config --get database.port)
  fi

  if test -z "${DB_USER}"; then
    echo "Missing database username in Gerrit config."
    exit 1
  fi

  if test -z "${DB_PASSWORD}"; then
    echo "Missing database password in Gerrit config."
    exit 1
  fi

  if test -z "${DB_NAME}"; then
    export DB_NAME="reviewdb"
  fi

  if test -z "${DB_HOST}"; then
    echo "Missing database host in Gerrit config."
    exit 1
  fi

  if test -z "${DB_PORT}"; then
    echo "Missing database port in Gerrit config."
    exit 1
  fi

  return 0
}

test_repositories(){
  local EXIT_CODE=0
  test -d "/var/gerrit/git/All-Projects.git" || EXIT_CODE=1
  return ${EXIT_CODE}
}

test_mysql_db(){
  local EXIT_CODE=0
  mysql -h ${DB_HOST} -P${DB_PORT} -u ${DB_USER} -p${DB_PASSWORD} ${DB_NAME} >/dev/null 2>&1 </dev/null || EXIT_CODE=1
  # Check existence of some tables
  for table in accounts changes patch_sets; do    # tables expected in Gerrit 2.12
    SQL_EXISTS=$(printf 'SHOW TABLES LIKE "%s"' "${table}")
    if [[ $(mysql -h ${DB_HOST} -P${DB_PORT} -u ${DB_USER} -p${DB_PASSWORD} -e "${SQL_EXISTS}" ${DB_NAME}) ]]; then
      echo "Table ${table} was found."
    else
      echo "Table ${table} was NOT found. Continuing to wait..."
      local EXIT_CODE=1
      break
    fi
  done
  return ${EXIT_CODE}
}

wait_for_repositories(){
  echo "Waiting for replicated repositories."
  while [ true ]; do
    test_repositories && break
    sleep 10
  done
  echo "The All-Projects.git repository was found."
}

wait_for_db_schema(){
  echo "Waiting for database to be ready."

  case "${DB_TYPE^^}" in
    MYSQL)
      while [ true ]; do
        test_mysql_db && break
        sleep 10
      done
      ;;

    *)
      echo "Database type ${DB_TYPE} not supported."
      exit 1
      ;;
  esac
  echo "Database was found."
}

wait_for_db_connection(){
  echo "Waiting for database connection..."

  case "${DB_TYPE^^}" in
    MYSQL)
      while ! mysqladmin ping -h "${DB_HOST}" -P"${DB_PORT}" --silent; do
          sleep 1
      done
      ;;

    *)
      echo "Database type ${DB_TYPE} not supported."
      exit 1
      ;;
  esac
}

# cleanup from last start
rm -f /var/gerrit/logs/gerrit.pid

# read db configuration from gerrit.config
get_db_config || exit 1

# wait for db to start
wait_for_db_connection

if [[ "$TEST_MODE" == "true" ]]; then
  java -jar /var/gerrit/bin/gerrit.war init \
    --batch \
    --no-auto-start \
    --install-plugin singleusergroup \
    -d /var/gerrit
fi

# wait for All-Projects to arrive via replication from master
wait_for_repositories

# wait for db schema to arrive via replication from master
wait_for_db_schema

echo "Gerrit site appears to be initialized. Gerrit slave can be startet."