#!/bin/sh
##
##  davical-setup
##

#   command line argument sanity check
prg="$0"
if [ $# -eq 0 ]; then
    echo "$prg:ERROR: invalid command line" 1>&2
    echo "$prg:USAGE: $prg install [<admin-password>]" 1>&2
    echo "$prg:USAGE: $prg uninstall" 1>&2
    echo "$prg:USAGE: $prg edit" 1>&2
    exit 1
fi

#   database configuration
db_dir="@l_prefix@/var/davical/db"
db_name="davical"
db_user="davical"
db_pass="davical"
db_sname=`grep "^superuser_database" @l_prefix@/var/postgresql/db/pg_superuser.conf |\
          sed -e 's;^ *superuser_database="\(.*\)".*;\1;'`
db_suser=`grep "^superuser_username" @l_prefix@/var/postgresql/db/pg_superuser.conf |\
          sed -e 's;^ *superuser_username="\(.*\)".*;\1;'`
db_spass=`grep "^superuser_password" @l_prefix@/var/postgresql/db/pg_superuser.conf |\
          sed -e 's;^ *superuser_password="\(.*\)".*;\1;'`

#   dispatch operation
cmd="${1:-"install"}"
shift
case "$cmd" in
    install )
        #   determine admin password
        admin_password="$1"
        if [ ".$admin_password" = . ]; then
            admin_password="`@l_prefix@/bin/apg -Mncl -a1 -m12 -n1`"
            echo "ATTENTION: using generated \"admin\" password: \"$admin_password\"" 1>&2
        fi

        #   create database
        ( echo "CREATE ROLE $db_user LOGIN ENCRYPTED PASSWORD '$db_pass' NOCREATEDB NOCREATEROLE;"
          echo "CREATE TABLESPACE $db_name OWNER $db_user LOCATION '$db_dir';"
          echo "CREATE DATABASE $db_name OWNER $db_user TABLESPACE $db_name TEMPLATE template0 ENCODING 'UTF8';"
        ) | PGPASSWORD="$db_spass" @l_prefix@/bin/psql -q -U "$db_suser" -d "$db_sname" -f-

        #   ensure PL/PgSQL language is available
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" \
            -c "CREATE LANGUAGE plpgsql;"

        #   create schema 1/2 (from original "create_database" script)
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/awl/dba/awl-tables.sql" 2>&1 | grep -v NOTICE
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/awl/dba/schema-management.sql" 2>&1 | grep -v NOTICE
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/davical/dba/davical.sql" 2>&1 | grep -v NOTICE
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/davical/dba/base-data.sql" 2>&1 | grep -v NOTICE

        #   create schema 2/3 (from nowhere, but required by appuser_permissions.txt below)
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/davical/dba/views/dav_principal.sql" 2>&1 | grep -v NOTICE

        #   create schema 3/3 (from original "update-davical-database" script)
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/davical/dba/supported_locales.sql" 2>&1 | grep -v NOTICE
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/davical/dba/caldav_functions.sql" 2>&1 | egrep -v '(NOTICE|ERROR)'
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/davical/dba/rrule_functions.sql" 2>&1 | egrep -v '(NOTICE|ERROR)'
        PGPASSWORD="$db_spass" @l_prefix@/bin/psql -q -U "$db_suser" -d "$db_name" -A -t \
            -f "@l_prefix@/lib/davical/davical/dba/appuser_permissions.txt" 2>&1 | grep -v NOTICE

        #   set admin password
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" \
            -c "UPDATE usr SET password = '**$admin_password' WHERE user_no = 1;"
        ;;

    uninstall )
        #   destroy PL/PgSQL language
        PGPASSWORD="$db_pass" @l_prefix@/bin/psql -q -U "$db_user" -d "$db_name" \
            -c "DROP LANGUAGE plpgsql CASCADE;" 2>&1 | grep -v NOTICE

        #   destroy database
        ( echo "DROP DATABASE $db_name;"
          echo "DROP TABLESPACE $db_name;"
          echo "DROP ROLE $db_user;"
        ) | PGPASSWORD="$db_spass" @l_prefix@/bin/psql -q -U "$db_suser" -d "$db_sname" -f-
        ;;

    edit )
        #   edit database
        PGPASSWORD="$db_spass" @l_prefix@/bin/psql -U "$db_suser" -d "$db_name"
        ;;
esac

