set -e

DOCKER_IP=`echo $DOCKER_HOST | sed 's/tcp:\/\///' | sed 's/:.*//'`
MYSQL_CONFIG_OVERRIDE="{\"DB_URI\":\"mysql+pymysql://root:password@$DOCKER_IP/genschema\"}"
PERCONA_CONFIG_OVERRIDE="{\"DB_URI\":\"mysql+pymysql://root:password@$DOCKER_IP/genschema\"}"
PGSQL_CONFIG_OVERRIDE="{\"DB_URI\":\"postgresql://postgres@$DOCKER_IP/genschema\"}"

up_mysql() {
  # Run a SQL database on port 3306 inside of Docker.
  docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql

  # Sleep for 10s to get MySQL get started.
  echo 'Sleeping for 10...'
  sleep 10

  # Add the database to mysql.
  docker run --rm --link mysql:mysql mysql sh -c 'echo "create database genschema" | mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -ppassword'
}

down_mysql() {
  docker kill mysql
  docker rm -v mysql
}

up_mariadb() {
  # Run a SQL database on port 3306 inside of Docker.
  docker run --name mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mariadb

  # Sleep for 10s to get MySQL get started.
  echo 'Sleeping for 10...'
  sleep 10

  # Add the database to mysql.
  docker run --rm --link mariadb:mariadb mariadb sh -c 'echo "create database genschema" | mysql -h"$MARIADB_PORT_3306_TCP_ADDR" -P"$MARIADB_PORT_3306_TCP_PORT" -uroot -ppassword'
}

down_mariadb() {
  docker kill mariadb
  docker rm -v mariadb
}

up_percona() {
  # Run a SQL database on port 3306 inside of Docker.
  docker run --name percona -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d percona

  # Sleep for 10s
  echo 'Sleeping for 10...'
  sleep 10

  # Add the daabase to mysql.
  docker run --rm --link percona:percona percona sh -c 'echo "create database genschema" | mysql -h $PERCONA_PORT_3306_TCP_ADDR -uroot -ppassword'
}

down_percona() {
  docker kill percona
  docker rm -v percona
}

up_postgres() {
  # Run a SQL database on port 5432 inside of Docker.
  docker run --name postgres -p 5432:5432 -d postgres

  # Sleep for 5s to get SQL get started.
  echo 'Sleeping for 5...'
  sleep 5

  # Add the database to postgres.
  docker run --rm --link postgres:postgres postgres sh -c 'echo "create database genschema" | psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'
}

down_postgres() {
  docker kill postgres
  docker rm -v postgres
}

gen_migrate() {
  # Generate a SQLite database with the schema as defined by the existing alembic model.
  QUAY_OVERRIDE_CONFIG=$1 PYTHONPATH=. alembic upgrade head

  # Generate the migration to the current model.
  QUAY_OVERRIDE_CONFIG=$1 PYTHONPATH=. alembic revision --autogenerate -m "$2"
}

test_migrate() {
  # Generate a SQLite database with the schema as defined by the existing alembic model.
  QUAY_OVERRIDE_CONFIG=$1 PYTHONPATH=. alembic upgrade head

  # Downgrade to verify it works in both directions.
  COUNT=`ls data/migrations/versions/*.py | wc -l | tr -d ' '`
  QUAY_OVERRIDE_CONFIG=$1 PYTHONPATH=. alembic downgrade "-$COUNT"
}

# Test (and generate, if requested) via MySQL.
echo '> Starting MySQL'
up_mysql

if [ ! -z "$@" ]
  then
    set +e
    echo '> Generating Migration'
    gen_migrate $MYSQL_CONFIG_OVERRIDE "$@"
    set -e
  fi

echo '> Testing Migration (mysql)'
set +e
test_migrate $MYSQL_CONFIG_OVERRIDE
set -e
down_mysql

# Test via MariaDB.
echo '> Starting MariaDB'
up_mariadb

echo '> Testing Migration (mariadb)'
set +e
test_migrate $MYSQL_CONFIG_OVERRIDE
set -e
down_mariadb

# Test via Percona.
echo '> Starting Percona'
up_percona

echo '> Testing Migration (percona)'
set +e
test_migrate $PERCONA_CONFIG_OVERRIDE
set -e
down_percona

# Test via Postgres.
echo '> Starting Postgres'
up_postgres

echo '> Testing Migration (postgres)'
set +e
test_migrate $PGSQL_CONFIG_OVERRIDE
set -e
down_postgres