#!/usr/bin/with-contenv bash
# shellcheck shell=bash

# set secret key if unset
SECRET_FILE="/config/secret_key_base.txt"
if [ -n "${SECRET_KEY_BASE}" ]; then
  echo "**** SECRET_KEY_BASE set in environment. ****"
elif [ -f "${SECRET_FILE}" ] && [ -s "${SECRET_FILE}" ]; then
  export SECRET_KEY_BASE=$(cat "${SECRET_FILE}" | tr -d '[:space:]')
else
  echo "**** SECRET_KEY_BASE not set, generating. ****"
  KEY=$(ruby -r "securerandom" -e "puts SecureRandom.hex(64)")
  echo "${KEY}" > "${SECRET_FILE}"
  export SECRET_KEY_BASE="${KEY}"
fi
printf "%s" "${SECRET_KEY_BASE}" > /var/run/s6/container_environment/SECRET_KEY_BASE

mkdir -p \
    /app/www/log \
    /app/www/tmp

lsiown -R abc:abc \
    /app/www/log \
    /app/www/tmp

printf %s "$(cat /app/www/GIT_SHA)" > /run/s6/container_environment/GIT_SHA

# Remove old pid in the event of an unclean shutdown
if [[ -f /app/www/tmp/pids/server.pid ]]; then
    rm /app/www/tmp/pids/server.pid
fi

DB_SCHEME=$(awk -F":" '{print $1}' <<<"${DATABASE_URL}")

if [[ ${DB_SCHEME} = "sqlite3" ]]; then
    DB_PATH=$(awk -F":" '{print $2}' <<<"${DATABASE_URL}")
    touch "${DB_PATH}"
    lsiown -R abc:abc \
        /config
elif [[ ${DB_SCHEME} = "postgresql" ]]; then
    DB_HOST=$(awk -F '@|:|/' '{print $6}' <<<"${DATABASE_URL}")
    DB_PORT=$(awk -F '@|:|/' '{print $7}' <<<"${DATABASE_URL}")
    DB_USER=$(awk -F '@|:|/' '{print $4}' <<<"${DATABASE_URL}")
    if [[ ! ${DB_PORT} =~ [0-9]+ ]]; then DB_PORT=5432; fi
    echo "Waiting for DB to be available"
    END=$((SECONDS + 30))
    while [[ ${SECONDS} -lt ${END} ]] && [[ -n "${DB_HOST+x}" ]]; do
        if pg_isready -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -q; then
            if [[ ! -f /run/dbwait.lock ]]; then
                sleep 5
            fi
            touch /run/dbwait.lock
            break
        else
            sleep 1
        fi
    done
elif [[ ${DB_SCHEME} = "mysql2" ]]; then
    DB_HOST=$(awk -F '@|:|/' '{print $6}' <<<"${DATABASE_URL}")
    DB_PORT=$(awk -F '@|:|/' '{print $7}' <<<"${DATABASE_URL}")
    if [[ ! ${DB_PORT} =~ [0-9]+ ]]; then DB_PORT=3306; fi
    echo "Waiting for DB to be available"
    END=$((SECONDS + 30))
    while [[ ${SECONDS} -lt ${END} ]] && [[ -n "${DB_HOST+x}" ]]; do
        if [[ $(/usr/bin/nc -w1 "${DB_HOST}" "${DB_PORT}" | tr -d '\0') ]]; then
            if [[ ! -f /run/dbwait.lock ]]; then
                sleep 5
            fi
            touch /run/dbwait.lock
            break
        else
            sleep 1
        fi
    done
else
    export DATABASE_URL=sqlite3:/config/manyfold.sqlite3
    printf "sqlite3:/config/manyfold.sqlite3" > /run/s6/container_environment/DATABASE_URL
    echo "**** Missing or invalid DATABASE_URL, defaulting to sqlite. ****"
fi

cd /app/www/ || exit 1

echo "**** Running Manyfold database init. ****"
s6-setuidgid abc /usr/bin/bundle exec rails db:prepare:with_data
