#!/usr/bin/env bash

# Detect if sudo needed
USER="$(whoami)"
SUDO=""
if [ ! "${USER}" == "root" ];then
  SUDO=$(id -Gn $USER | grep -q docker) || SUDO="sudo "
fi

DOCKER="${SUDO}docker"
COMPOSE="${SUDO}docker-compose"

function die () {
    echo >&2 "$@"
    exit 1
}

if [ $# -gt 0 ];then

  if [ "$1" == "exec" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  "$ARGS"

  elif [ "$1" == "test" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      "cd /var/www && vendor/bin/codecept run -s acceptance --env platform $ARGS" ;

  elif [ "$1" == "test-debug" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      'cd /var/www && export XDEBUG_CONFIG="idekey=PHPSTORM" && php -dxdebug.remote_host=$(/sbin/ip route|awk '\''/default/ {print $3 }'\'') vendor/bin/codecept run -s acceptance --env platform '$ARGS

  elif [ "$1" == "test-profile" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      'cd /var/www && php -dxdebug.profiler_enable=On  vendor/bin/codecept run -s acceptance --env platform '$ARGS

  elif [ "$1" == "test-acceptance" ]; then
    shift 1
    ARGS="$@"
    ./tests/chromedriver --url-base=/wd/hub --whitelisted-ips="" & pid1="$!" ;
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      "cd /var/www && vendor/bin/codecept run acceptance $ARGS" ;
      kill $pid1

  elif [ "$1" == "test-travis" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      "cd /var/www && vendor/bin/codecept run --env platform $ARGS" ;

  elif [ "$1" == "test-frontend" ]; then
    shift 1
    ${COMPOSE} run --rm -w /var/www \
        -u $(id -u):www-data \
        node \
        npm -s start "$@"

  elif [ "$1" == "artisan" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      "cd /var/www && php artisan $ARGS"

  elif [ "$1" == "artisan-debug" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      'cd /var/www && export XDEBUG_CONFIG="idekey=PHPSTORM" && php -dxdebug.remote_host=$(/sbin/ip route|awk '\''/default/ {print $3 }'\'') ./artisan '$ARGS

  elif [ "$1" == "composer" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      "cd /var/www && composer $ARGS"

  elif [ "$1" == "npm" ]; then
    shift 1
    ${COMPOSE} run --rm -w /var/www \
        -u $(id -u):www-data \
        node \
        npm -s "$@"

  elif [ "$1" == "mount" ] || [ "$1" == "umount" ]; then
    ./scripts/link_package.sh "$@"

  elif [ "$1" == "clean" ]; then
    shift 1
    ${DOCKER} volume ls -qf dangling=true | xargs -r ${DOCKER} volume rm
    ${DOCKER} images -q --no-trunc | xargs -r ${DOCKER} rmi || true

  elif [ "$1" == "db-dump" ]; then
    shift 1
    [ ! -z $1 ] || die "Please specify database name"
    ${COMPOSE} exec --user $(id -u) db sh -c "pg_dump -U postgres --clean --if-exists --no-owner -n public $1 | gzip > /backups/$1_$(date +%Y%m%d_%H%M).sql.gz"

  elif [ "$1" == "db-restore" ]; then
    shift 1
    [ ! -z $1 ] || die "Please specify database name"
    [ ! -z $2 ] || die "Please specify dump path"
    ${COMPOSE} exec --user $(id -u) db sh -c "gunzip -c /$2 | psql -U postgres --single-transaction -a $1"

  elif [ "$1" == "db-dump-tests" ]; then
    shift 1
    [ ! -z $1 ] || die "Please specify database name"
    ${COMPOSE} exec --user $(id -u) db sh -c "pg_dump -U postgres --clean --if-exists --no-owner -n public $1 > /backups/dump.sql"
    mv backups/dump.sql tests/db/dump.sql

  elif [ "$1" == "generate-api-docs" ]; then
    shift 1
    ARGS="$@"
    ${COMPOSE} exec --user $(id -u):www-data \
      web bash -c  \
      "cd /var/www && php artisan l5-swagger:generate"

  elif [ "$1" == "generate-cert" ]; then
    shift 1
    echo $1 | grep -E -q '^localhost$|^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$' || die "Not valid domain"
    if [ "$2" == "dhparam" ]; then
        openssl dhparam -out ./.server/ssl/$1.dhparam.pem 2048
    fi
    openssl req -x509 -newkey rsa:4086 \
    -subj "/C=PL/ST=XXXX/L=XXXX/O=GrupaZero/CN=$1" \
    -keyout ./.server/ssl/$1.key \
    -out ./.server/ssl/$1.crt \
    -days 3650 -nodes -sha256
  else
      ${COMPOSE} "$@"
  fi
else
  ${COMPOSE} ps
fi
