#!/usr/bin/env bash
set -euo pipefail
set -E

mysql_env() {
  case "${BUILD_ENV:-}" in
    prod|qa|uat) _mysql_env_aws ;;
    *) : ;;
  esac

  : "${MYSQL_DB_NAME:?MYSQL_DB_NAME is required}"
  : "${MYSQL_DEPLOY_USER:?MYSQL_DEPLOY_USER is required}"
  : "${MYSQL_DEPLOY_PASSWORD:?MYSQL_DEPLOY_PASSWORD is required}"

  : "${MYSQL_DB_HOST:=127.0.0.1}"
  : "${MYSQL_DB_PORT:=3306}"
  : "${MYSQL_SERVICE_USER:=${MYSQL_DEPLOY_USER}}"
  : "${MYSQL_TEST_DB_NAME:=${MYSQL_DB_NAME}_test}"
}

mysql_init() {
  try_cmd "mysql"
  mysql_env
}

mysql_wait_ready() {
  info "[mysql] Waiting for ${MYSQL_DB_HOST}:${MYSQL_DB_PORT}..."

  local cmd
  if has_cmd "mysqladmin"; then
    cmd="mysqladmin -h '${MYSQL_DB_HOST}' -P '${MYSQL_DB_PORT}' ping --silent"
  else
    has_cmd "nc" || die "[mysql] mysqladmin and nc not found on PATH"
    cmd="nc -z '${MYSQL_DB_HOST}' '${MYSQL_DB_PORT}'"
  fi

  timeout 60 bash -c "until ${cmd} >/dev/null 2>&1; do sleep 1; done" \
    || die "[mysql] Timed out waiting for MySQL"
}

mysql_create_db() {
  info "[mysql] Creating database '${MYSQL_DB_NAME}'"
  
  MYSQL_PWD="${MYSQL_DEPLOY_PASSWORD}" \
  mysql \
    --connect-timeout=10 \
    -h "${MYSQL_DB_HOST}" \
    -P "${MYSQL_DB_PORT}" \
    -u "${MYSQL_DEPLOY_USER}" \
    -e "CREATE DATABASE IF NOT EXISTS \`${MYSQL_DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
}

mysql_create_test_db() {
  MYSQL_PWD="${MYSQL_DEPLOY_PASSWORD}" \
  mysql \
    --connect-timeout=10 \
    -h "${MYSQL_DB_HOST}" \
    -P "${MYSQL_DB_PORT}" \
    -u "${MYSQL_DEPLOY_USER}" \
    -e "CREATE DATABASE IF NOT EXISTS \`${MYSQL_TEST_DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
        GRANT ALL PRIVILEGES ON \`${MYSQL_TEST_DB_NAME}\`.* TO '${MYSQL_SERVICE_USER}'@'%';
        GRANT ALL PRIVILEGES ON \`${MYSQL_TEST_DB_NAME}\_%\`.* TO '${MYSQL_SERVICE_USER}'@'%';
        GRANT CREATE, DROP ON \`${MYSQL_TEST_DB_NAME}\_%\`.* TO '${MYSQL_SERVICE_USER}'@'%';
        FLUSH PRIVILEGES;"
}

mysql_migrate() {
  local db="${1:?db name required}"

  try_cmd "liquibase"

  info "[mysql] Migrating database '${db}'"

  LIQUIBASE_COMMAND_USERNAME="${MYSQL_DEPLOY_USER}" \
  LIQUIBASE_COMMAND_PASSWORD="${MYSQL_DEPLOY_PASSWORD}" \
  liquibase \
    --changeLogFile="${CHANGELOG_FILE}" \
    --classpath="${APP_DIR}/mysql-connector-j.jar" \
    --contexts="${CONTEXTS}" \
    --driver=com.mysql.cj.jdbc.Driver \
    --url="jdbc:mysql://${MYSQL_DB_HOST}:${MYSQL_DB_PORT}/${db}?allowPublicKeyRetrieval=true&useSSL=false" \
    update 2>&1
}

_mysql_env_aws() {
  try_cmd "aws"

  local s3_location="s3://nickelback/db-deploy/${BUILD_ENV}/${GITHUB_REPO_DIR}/db.properties"
  local tmp_file="/tmp/db.properties"

  info "[mysql] Copying ${s3_location}"
  aws s3 cp "${s3_location}" "${tmp_file}" >/dev/null || die "[mysql] Failed to copy ${s3_location}"
  
  source "${tmp_file}"
  MYSQL_DB_HOST="${targetdbhost}"
  MYSQL_DB_NAME="${targetdb}"
  MYSQL_DEPLOY_USER="${username}"
  MYSQL_DEPLOY_PASSWORD="${password}"
  CONTEXTS="${BUILD_ENV}"

  # Remove the temp file
  rm "${tmp_file}"
}
