#!/bin/bash

# There seems to be [a bug with docker-compose](https://github.com/docker/compose/issues/4076#issuecomment-324932294) 
# where it takes ~40ms to connect to the terminal output of the container, so stuff logged to the terminal in this time is lost.
# The best workaround seems to be adding tiny delay like so:
sleep 0.1;

MIGRATE_DIRECTORY="/mnt/migrator/DbScripts"
LAST_MIGRATION_FILE="/mnt/data/last_migration"
SERVER='mssql'
DATABASE="vault_dev"
USER="SA"
PASSWD=$MSSQL_PASSWORD

while getopts "rs" arg; do
  case $arg in
    r)
      echo "Rerunning the last migration"
      RERUN=1
      ;;
    s)
      echo "Running for self-host environment"
      LAST_MIGRATION_FILE="/mnt/data/last_self_host_migration"
      DATABASE="vault_dev_self_host"
      ;;
  esac
done

if [ ! -f "$LAST_MIGRATION_FILE" ]; then
  echo "$LAST_MIGRATION_FILE not found!"
  echo "This will run all migrations which might cause unexpected behaviour if the database is not empty."
  echo
  read -p "Run all Migrations? (y/N) " -n 1 -r
  echo
  if [[ ! $REPLY =~ ^[Yy]$ ]]
  then
      exit 1
  fi
  LAST_MIGRATION=""
else
  LAST_MIGRATION=$(cat $LAST_MIGRATION_FILE)
fi

[ -z "$LAST_MIGRATION" ]
PERFORM_MIGRATION=$?


# Create database if it does not already exist
QUERY="IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = '$DATABASE')
BEGIN
  CREATE DATABASE $DATABASE;
END;"

/opt/mssql-tools/bin/sqlcmd -S $SERVER -d master -U $USER -P $PASSWD -I -Q "$QUERY"

migrate () {
  local file=$1
  echo "Performing $file"
  /opt/mssql-tools/bin/sqlcmd -S $SERVER -d $DATABASE -U $USER -P $PASSWD -I -i $file
  echo $file > $LAST_MIGRATION_FILE
}

for f in `ls -v $MIGRATE_DIRECTORY/*.sql`; do
  if (( PERFORM_MIGRATION == 0 )); then
    migrate $f
  else
    echo "Skipping $f"
    if [ "$LAST_MIGRATION" == "$f" ]; then
      PERFORM_MIGRATION=0

      # Rerun last migration
      if [ -n "$RERUN" ]; then
        migrate $f
        unset RERUN
      fi
    fi
  fi
done;