#!/bin/bash

set -e

usage() {
  echo -e "usage:\t$0 DIRECTORY, e.g. $0 pica-mattermost"
  echo -e "\tDIRECTORY : name of the directory containing docker-compose.yml\n"
  echo "This script simulates the first launch of a service : it will recreate all existing volumes for the service"
  echo "to be sure that it works independently of the former configuration, and then launch 'docker-compose up -d'."
  echo "This way, you can test your Dockerfile | docker-compose on the testing VM as if it was a brand new VM."
  echo -e "\nAlso, it will temporarily replace all occurences of 'picasoft.net' by 'test.picasoft.net' for convenience."
  echo -e "\nThis script will also build and pull all the required images based on the docker-compose.yml file."
  echo -e "\nUSE THIS SCRIPT ONLY ON THE TESTING VM."
  exit 1
}

create_dumb_secrets() {
  if [[ -d secrets ]]; then
    cd secrets
    echo -e "\n==== Create dumb secret files ===="
    for f in *.secrets.example; do
        echo -e "\tFile $1/secrets/$(basename -- "$f" .secrets.example).secrets created"
        cp -- "$f" "$(basename -- "$f" .secrets.example).secrets"
    done
    cd ..
  fi
}

if [[ $(hostname) != *"test"* ]]; then
  echo "ERROR : DO NOT USE OUTSIDE OF A TEST MACHINE !"
  usage
fi

if [[ $# -ne 1 ]]; then
  echo "ERROR : wrong number of arguments"
  usage
fi

echo -e "Starting procedure for \033[31m$1\e[0m..."

# In case the Docker Compose changed since latest local commit,
# we need to set all down before pulling
if [[ -d "$1" ]]; then
  # Go to the folder of the service which will be tested
  cd "$1"

  create_dumb_secrets

  echo -e "\n==== Stop and remove existing containers and volumes ===="
  docker-compose down -v
  cd ..
else
  echo "WARNING : directory does not exist ($1) ; will try to pull"
fi

echo -e "\n==== Pull Dockerfiles repository ===="
echo -e "Using branch \033[31m $(git rev-parse --abbrev-ref HEAD)\e[0m, is this correct ? [y/N]"
read ans

if [ $ans == "y" ]; then
  git pull
  git checkout -- $1
else
  echo "Aborting."
  exit 0
fi

if [[ ! -d "$1" ]]; then
  echo "ERROR : directory does not exist ($1)"
  usage
  exit 1
fi

cd "$1"

create_dumb_secrets

echo -e "\n==== Remove and re-create named external volumes ===="
for v in $(docker-compose config --volumes); do
  res=$(grep $v -A 1 docker-compose.yml | grep 'external' || true)
  if [ ! -z "$res" ]; then
    # Don't fail if volume does not exists
    docker volume rm "$v" || true
    docker volume create "$v"
  fi
done

echo -e "\n==== Remove old images ===="
# For some reasons, sometime docker-compose does not pull the newer image. Force this!
docker-compose config | grep "image:" | cut -d ':' -f 2- | xargs docker image rm || true

echo -e "\n==== Build custom images ===="
docker-compose build

echo -e "\n==== Pull new versions of external images ===="
docker-compose pull

# Except for registry URL, useful to push to production registry after build
echo -e "\n==== Replace production URL with testing URL in all files ===="
for f in $(grep -l -r ".picasoft.net" .); do
  echo -e "\tFound in" ${f}
  sed -i "s/.picasoft.net/.test.picasoft.net/g" ${f}
  sed -i "s/registry.test.picasoft.net/registry.picasoft.net/g" ${f}
done

echo -e "\n==== Lauch $1 ===="
docker-compose up -d

echo -e "\n==== Print logs (use Ctrl+C to stop) ===="
docker-compose logs -f