#!/bin/bash

# This script will run as the postgres user due to the Dockerfile USER directive

DATADIR="/var/lib/postgresql/9.5/main"
CONF="/etc/postgresql/9.5/main/postgresql.conf"
POSTGRES="/usr/lib/postgresql/9.5/bin/postgres"
INITDB="/usr/lib/postgresql/9.5/bin/initdb"
SQLDIR="/usr/share/postgresql/9.5/contrib/postgis-2.2/"
LOCALONLY="-c listen_addresses='127.0.0.1, ::1'"

# /etc/ssl/private can't be accessed from within container for some reason
# (@andrewgodwin says it's something AUFS related)  - taken from https://github.com/orchardup/docker-postgresql/blob/master/Dockerfile
cp -r /etc/ssl /tmp/ssl-copy/
chmod -R 0700 /etc/ssl
chown -R postgres /tmp/ssl-copy
rm -r /etc/ssl
mv /tmp/ssl-copy /etc/ssl

# Needed under debian, wasnt needed under ubuntu
mkdir /var/run/postgresql/9.5-main.pg_stat_tmp
chmod 0777 /var/run/postgresql/9.5-main.pg_stat_tmp

# test if DATADIR is existent
if [ ! -d $DATADIR ]; then
  echo "Creating Postgres data at $DATADIR"
  mkdir -p $DATADIR
fi
# needs to be done as root:
chown -R postgres:postgres $DATADIR

# Note that $POSTGRES_USER and $POSTGRES_PASS below are optional paramters that can be passed
# via docker run e.g.
#docker run --name="postgis" -e POSTGRES_USER=qgis -e POSTGRES_PASS=qgis -d -v 
#/var/docker-data/postgres-dat:/var/lib/postgresql -t qgis/postgis:6

# If you dont specify a user/password in docker run, we will generate one
# here and create a user called 'docker' to go with it.


# test if DATADIR has content
if [ ! "$(ls -A $DATADIR)" ]; then

  # No content yet - first time pg is being run!
  # Initialise db
  echo "Initializing Postgres Database at $DATADIR"
  #chown -R postgres $DATADIR
  su - postgres -c "$INITDB $DATADIR"
fi

# Make sure we have a user set up
if [ -z "$POSTGRES_USER" ]; then
  POSTGRES_USER=docker
fi  
if [ -z "$POSTGRES_PASS" ]; then
  POSTGRES_PASS=docker
fi  
# Set a default database name
if [ -z "$POSTGRES_DBNAME" ]; then
  POSTGRES_DBNAME=gis
fi
# Enable hstore and topology by default
if [ -z "$HSTORE" ]; then
  HSTORE=true
fi  
if [ -z "$TOPOLOGY" ]; then
  TOPOLOGY=true
fi  

# Custom IP range via docker run -e (https://docs.docker.com/engine/reference/run/#env-environment-variables)
# Usage is: docker run [...] -e ALLOW_IP_RANGE='192.168.0.0/16' 
if [ "$ALLOW_IP_RANGE" ]
then
  echo "host    all             all             $ALLOW_IP_RANGE              md5" >> /etc/postgresql/9.5/main/pg_hba.conf
fi

# redirect user/pass into a file so we can echo it into
# docker logs when container starts
# so that we can tell user their password
echo "postgresql user: $POSTGRES_USER" > /tmp/PGPASSWORD.txt
echo "postgresql password: $POSTGRES_PASS" >> /tmp/PGPASSWORD.txt
su - postgres -c "$POSTGRES --single -D $DATADIR -c config_file=$CONF <<< \"CREATE USER $POSTGRES_USER WITH SUPERUSER ENCRYPTED PASSWORD '$POSTGRES_PASS';\""

trap "echo \"Sending SIGTERM to postgres\"; killall -s SIGTERM postgres" SIGTERM

su - postgres -c "$POSTGRES -D $DATADIR -c config_file=$CONF $LOCALONLY &"

# wait for postgres to come up
until `nc -z 127.0.0.1 5432`; do
    echo "$(date) - waiting for postgres (localhost-only)..."
    sleep 1
done
echo "postgres ready"


RESULT=`su - postgres -c "psql -l | grep postgis | wc -l"`
if [[ ${RESULT} == '1' ]]
then
    echo 'Postgis Already There'

    if [[ ${HSTORE} == "true" ]]; then
        echo 'HSTORE is only useful when you create the postgis database.'
    fi
    if [[ ${TOPOLOGY} == "true" ]]; then
        echo 'TOPOLOGY is only useful when you create the postgis database.'
    fi
else
    echo "Postgis is missing, installing now"
    # Note the dockerfile must have put the postgis.sql and spatialrefsys.sql scripts into /root/
    # We use template0 since we want t different encoding to template1
    echo "Creating template postgis"
    su - postgres -c "createdb template_postgis -E UTF8 -T template0"
    echo "Enabling template_postgis as a template"
    CMD="UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template_postgis';"
    su - postgres -c "psql -c \"$CMD\""
    echo "Loading postgis extension"
    su - postgres -c "psql template_postgis -c 'CREATE EXTENSION postgis;'"

    if [[ ${HSTORE} == "true" ]]
    then
        echo "Enabling hstore in the template"
        su - postgres -c "psql template_postgis -c 'CREATE EXTENSION hstore;'"
    fi
    if [[ ${TOPOLOGY} == "true" ]]
    then
        echo "Enabling topology in the template"
        su - postgres -c "psql template_postgis -c 'CREATE EXTENSION postgis_topology;'"
    fi

    # Needed when importing old dumps using e.g ndims for constraints
    echo "Loading legacy sql"
    su - postgres -c "psql template_postgis -f $SQLDIR/legacy_minimal.sql"
    su - postgres -c "psql template_postgis -f $SQLDIR/legacy_gist.sql"
    # Create a default db called 'gis' that you can use to get up and running quickly
    # It will be owned by the docker db user
    su - postgres -c "createdb -O $POSTGRES_USER -T template_postgis $POSTGRES_DBNAME"
fi

#This should show up in docker logs afterwards
su - postgres -c "psql -l"

PID=`cat /var/run/postgresql/9.5-main.pid`
kill -9 ${PID}
echo "Postgres initialisation process completed .... restarting in foreground"
SETVARS="POSTGIS_ENABLE_OUTDB_RASTERS=1 POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL"
su - postgres -c "$SETVARS $POSTGRES -D $DATADIR -c config_file=$CONF"
