# Adapted from github comment:
# https://github.com/dimitri/pgloader/issues/782#issuecomment-1136067634

if [ -z "$3" ]; then
    echo "Usage: $0 <db name> <mysql dump> <psql dump output>"
    echo "Requirements: docker"
    exit 1
fi

if ! command -v docker &> /dev/null
then
    echo "docker could not be found"
    exit
fi

set +e
docker stop mysql1 psql1 &> /dev/null
set -e

DB_NAME=$1
SOURCE_DUMP=$2
TARGET_DUMP=$3

echo "DB_NAME=$DB_NAME"
echo "SOURCE_DUMP=$SOURCE_DUMP"
echo "TARGET_DUMP=$TARGET_DUMP"

echo "Starting MYSQL"
# Prepare MySQL
docker run --rm \
  --name mysql1 \
  -e MYSQL_ROOT_PASSWORD=pass \
  -p 3300:3306 \
  -d mysql \
  --default-authentication-plugin=mysql_native_password

echo "Waiting for MySQL port"
docker run willwill/wait-for-it -t 10 172.17.0.1:3300 # wait DB to start

echo "Waiting for MySQL to be ready"
while true; do
  set +e
  sleep 1;
  # Wait for two matches of waiting for connections since the first one is a
  # temporary server
  count=`docker logs mysql1 2>&1 | grep -E 'mysqld: ready for connections' -c`
  if [ "$count" -eq 2 ]; then
    set -e
      break
  fi
done

echo "Importing MySQL dump"
docker exec -i mysql1 mysql -ppass < $SOURCE_DUMP

echo "Starting PostgreSQL"
# Prepare Postgres
docker run --rm --name psql1 -e POSTGRES_PASSWORD=pass -p 5500:5432 -d postgres
sleep 3 # wait DB to start
docker exec -e POSTGRES_PASSWORD=pass psql1 createdb -U postgres $DB_NAME

echo "Loading Mysql to Postgres"
# Run pgloader
docker run dimitri/pgloader \
  pgloader mysql://root:pass@172.17.0.1:3300/$DB_NAME \
  postgresql://postgres:pass@172.17.0.1:5500/$DB_NAME

echo "Exporting Postgres dump"
# Dump Postgres DB
docker exec -i \
  -e POSTGRES_PASSWORD=pass \
  psql1 pg_dump -U postgres --no-privileges --no-owner $DB_NAME > $TARGET_DUMP

echo "Adding schema rename to dump"
echo "BEGIN TRANSACTION;
  ALTER SCHEMA public          RENAME TO public_original;
  ALTER SCHEMA $DB_NAME        RENAME TO public;
  DROP SCHEMA  public_original CASCADE;
COMMIT;" >> $TARGET_DUMP

docker stop mysql1 psql1