#!/bin/bash

SOURCE_DIR=$(realpath $(dirname "${0}"))/gnuhealth

# Install dependencies for GNU Health
apt-get -y --no-install-recommends install python3 python3-virtualenv virtualenv

# Add NodeJS repository for Sao (Tryton web client)
wget https://deb.nodesource.com/gpgkey/nodesource.gpg.key -O - | apt-key add -
echo 'deb https://deb.nodesource.com/node_8.x stretch main' > /etc/apt/sources.list.d/nodejs.list
apt-get -y update

# Install dependencies for Sao (Tryton web client)
apt-get -y --no-install-recommends install nodejs

# Download GNU Health
wget http://ftp.gnu.org/gnu/health/gnuhealth-3.2.8.tar.gz -O /tmp/gnuhealth.tgz
tar xzf /tmp/gnuhealth.tgz -C /srv
mv /srv/gnuhealth-3.2.8 /srv/gnuhealth
rm -f /tmp/gnuhealth.tgz

# Clone Sao (Tryton web client) repository
git clone -b 4.2 --single-branch --depth 1 https://github.com/tryton/sao /srv/gnuhealth/sao

# Apply Sao (Tryton web client) dependencies patch
patch -d /srv/gnuhealth/sao -p0 <${SOURCE_DIR}/gnuhealth-sao-dependencies.patch

# Create Python virtualenv
virtualenv --system-site-packages -p /usr/bin/python3 /srv/gnuhealth
echo '. /srv/gnuhealth/bin/activate' >/srv/gnuhealth/.bash_profile

# Create databases
export GNUHEALTH_PWD=$(head -c 18 /dev/urandom | base64 |  tr -d '/+=')
envsubst <${SOURCE_DIR}/tmp/gnuhealth-createdb.sql >/tmp/gnuhealth-createdb.sql
sudo -u postgres psql -f /tmp/gnuhealth-createdb.sql
rm -f /tmp/gnuhealth-createdb.sql

# Create GNU Health OS user
adduser --system --group --home /srv/gnuhealth --shell /bin/bash gnuhealth
chown -R gnuhealth:gnuhealth /srv/gnuhealth

# Install GNU Health
sudo -u gnuhealth -i /srv/gnuhealth/gnuhealth-setup install

# Install Sao (Tryton web client)
sudo -u gnuhealth npm install --production --prefix /srv/gnuhealth/sao
sudo -u gnuhealth bash -c 'cd /srv/gnuhealth/sao && /srv/gnuhealth/sao/node_modules/grunt-cli/bin/grunt'

# Configure GNU Health
envsubst <${SOURCE_DIR}/srv/gnuhealth/gnuhealth/tryton/server/config/trytond.conf >/srv/gnuhealth/gnuhealth/tryton/server/config/trytond.conf

# Populate database
export GNUHEALTH_ADMIN_PWD=$(head -c 12 /dev/urandom | base64)
echo ${GNUHEALTH_ADMIN_PWD} >/srv/gnuhealth/.adminpwd
sudo -u gnuhealth -i TRYTONPASSFILE=/srv/gnuhealth/.adminpwd /srv/gnuhealth/gnuhealth/tryton/server/trytond-4.2.8/bin/trytond-admin -d gnuhealth --all -v
rm -f /srv/gnuhealth/.adminpwd

# Populate demo database
wget http://health.gnu.org/downloads/postgres_dumps/gnuhealth-3.2rc1.sql.gz -O /tmp/gnuhealth_demo.sql.gz
export PGPASSWORD=${GNUHEALTH_PWD}
zcat /tmp/gnuhealth_demo.sql.gz | psql gnuhealth_demo gnuhealth
unset PGPASSWORD
rm -f /tmp/gnuhealth_demo.sql.gz

# Configure GNU Health service
cp ${SOURCE_DIR}/lib/systemd/system/gnuhealth.service /lib/systemd/system/gnuhealth.service
systemctl daemon-reload
systemctl enable gnuhealth
systemctl start gnuhealth

# Create nginx site definition
cp ${SOURCE_DIR}/etc/nginx/sites-available/gnuhealth /etc/nginx/sites-available/gnuhealth
ln -s /etc/nginx/sites-available/gnuhealth /etc/nginx/sites-enabled/gnuhealth

# Restart nginx
systemctl restart nginx

# Add portal application definition
portal-app-manager gnuhealth "https://{host}:8006/index.html" admin "${GNUHEALTH_ADMIN_PWD}"
portal-app-manager gnuhealth-clients -p clienturl "{host}:8006"
