#!/usr/bin/env bash
set -aeuo pipefail

# IMPORTANT: This start script does not ship with production and staging
# builds. The start script for both production and staging is:
#
#   deploy/resources/start-script
#

if [ ! $(which git-lfs) ]; then
    echo "You need Git LFS to run this project"
    echo ""
    echo "    https://git-lfs.github.com"
    echo ""
    exit 1
fi

git-lfs pull

# create the dotenv file if it doesn't exist
if [ ! -f .env ]; then
    source .env.default

    if [ ! -v 'PROJECT' ]; then
        PROJECT="$(basename "$(pwd)")"
        echo "PROJECT=$PROJECT" > /tmp/dotenv
        cat .env.default >> /tmp/dotenv
        mv /tmp/dotenv .env.default
    fi

    cp .env.default .env

    echo "DOCKER_HOST_UID=$(id -u)" >> .env
    echo "DOCKER_HOST_GID=$(id -g)" >> .env

    echo "Created boilerplate .env file at:"
    echo ""
    echo "    $(pwd)/.env"
    echo ""
fi

source .env.default
source .env

if [ ! -v 'COMPOSE_PROJECT_NAME' ]; then
    COMPOSE_PROJECT_NAME="${PROJECT}_${ENVIRONMENT}"
    echo "COMPOSE_PROJECT_NAME=$COMPOSE_PROJECT_NAME" >> .env
fi

DB_CONTAINER=${COMPOSE_PROJECT_NAME}_db
BUILDBOX_CONTAINER=${COMPOSE_PROJECT_NAME}_buildbox

# wait for mysql server to start accepting queries
init_mysql () {
    docker exec -u root ${COMPOSE_PROJECT_NAME}_db bash -c "chown -R mysql: /var/log/mysql"

    while [ 0 ]; do
        cmd="mysql -u root -p${DB_PASSWORD} -e 'SELECT \"READY\"' 2> /dev/null"
        result=$(docker exec ${COMPOSE_PROJECT_NAME}_db bash -c "$cmd" || true)
        sleep 1

        if [[ "$result" =~ "READY" ]]; then
            break
        fi
    done

    docker exec ${COMPOSE_PROJECT_NAME}_db bash -c "mysql -u root -p${DB_PASSWORD} -e \"SET GLOBAL general_log = 1\" 2> /dev/null";
    docker exec ${COMPOSE_PROJECT_NAME}_db bash -c "mysql -u root -p${DB_PASSWORD} -e \"SET GLOBAL general_log_file = '/var/log/mysql/mysql.log'\" 2> /dev/null";
}

################################################################################

echo "Generating docker-compose.yml"
./generate-docker-compose

# Preemptively create dependency manager cache directories on the host
# so that docker does not create them as root
mkdir -p "$HOME/.yarn" "$HOME/.yarn-cache" "$HOME/.yarn-config"
mkdir -p "$HOME/.composer/cache"

echo "Starting buildbox container"
docker-compose up -d buildbox

echo "Installing NPM dependencies"
./npm config set registry "$NPM_REGISTRY"
./npm install

echo "Installing Composer dependencies"
./composer -vv install --ignore-platform-reqs

echo "Generating nginx virtual host configuration"
./gulp generate-nginx-vhost

echo "Launching containers"
docker-compose up -d

echo "Waiting for MySQL server to start accepting queries..."
init_mysql

echo "Running database migrations and seeders"
./artisan migrate
./artisan db:seed

echo "Starting Webpack development server"
./npm run webpack-dev-server

