#!/bin/bash

SYS_CONF="/etc/qtoggleserver.conf"
BOOT_CONF="/boot/qtoggleserver.conf"
CONF="/data/etc/qtoggleserver.conf"
LOG="/var/log/qtoggleserver.log"

PROG="/usr/bin/qtoggleserver"

SYS_DRIVERS="/usr/lib/qtoggleserver-drivers"
USER_DRIVERS="/data/qtoggleserver-drivers"

WATCH_TIMEOUT=60
WATCH_INTERVAL=10


test -n "${OS_VERSION}" || source /etc/init.d/base

prepare_conf ${CONF} ${SYS_CONF} ${BOOT_CONF}
test -f ${CONF} || exit 0


PORT=80
SCHEME="http"
DB_NAME="qtoggleserver"

PORT_RE="server[[:space:]]*=?[[:space:]]*\{[^#\}p]*port[[:space:]]*=[[:space:]]*([0-9]+)"
CERT_RE="https[[:space:]]*=?[[:space:]]*\{[^#\}c]*cert_file[[:space:]]*=[[:space:]]*([^#\} ]+)"
PERSIST_DRIVER_RE="persist[[:space:]]*=?[[:space:]]*\{[^#\}d]*driver[[:space:]]*=[[:space:]]*\"?([a-zA-Z0-9.]+)\"?"

[[ $(<${CONF}) =~ ${PORT_RE} ]] && PORT=${BASH_REMATCH[1]}
[[ $(<${CONF}) =~ ${CERT_RE} ]] && SCHEME="https"
[[ $(<${CONF}) =~ ${PERSIST_DRIVER_RE} ]] && PERSIST_DRIVER=${BASH_REMATCH[1]}

responsive() {
    curl -m 2 --insecure --head "${SCHEME}://127.0.0.1:${PORT}/frontend/static/qtoggleserver-bundle-dark.css" &>/dev/null && return 0 || return 1
}

watch() {
    count=0
    while true; do
        sleep ${WATCH_INTERVAL}
        if responsive; then
            count=0
        else
            if [[ $count -lt ${WATCH_TIMEOUT} ]]; then
                count=$(($count + ${WATCH_INTERVAL}))
            else
                panic action qtoggleserver "not responding for ${WATCH_TIMEOUT} seconds"
                break
            fi
        fi
    done
}

setup_persist() {
    if [[ "${PERSIST_DRIVER}" =~ PostgreSQLDriver$ ]]; then
        if ! psql -U postgres -Altw | grep -q ${DB_NAME}; then
            msg_begin "Creating postgresql ${DB_NAME} db"
            psql -U postgres -Atwq -c "CREATE DATABASE ${DB_NAME}"
            test $? == 0 && msg_done || msg_fail
        fi
    fi
}

start() {
    setup_persist

    msg_begin "Starting qtoggleserver"

    export PYTHONPATH=${PYTHONPATH}:${SYS_DRIVERS}/fwupdate:${SYS_DRIVERS}/persist:${SYS_DRIVERS}/ports
    export PYTHONPATH=${PYTHONPATH}:${USER_DRIVERS}/fwupdate:${USER_DRIVERS}/persist:${USER_DRIVERS}/ports

    ${PROG} -c ${CONF} &>> ${LOG} &

    count=0
    while true; do
        sleep 1

        if responsive; then
            break
        fi

        if [[ $count -gt ${WATCH_TIMEOUT} ]]; then
            msg_fail
            return 1
        fi

        count=$((count + 1))
    done

    watch &

    msg_done
}

stop() {
    msg_begin "Stopping qtoggleserver"
    
    base_prog=$(basename ${PROG})
    if killall -q ${base_prog}; then
        # Allow up to 5 seconds for a graceful shutdown
        for ((i = 0; i < 5; i++)); do
            if ! killall -q -0 ${base_prog}; then
                msg_done
                break
            fi
            sleep 1
        done
        if [[ ${i} == 5 ]]; then
            killall -q -9 ${base_prog}
            msg_fail "killed"
        fi
    else
        msg_fail
    fi
    
    # Kill any remainings of qtoggleserver processes with SIGKILL
    ps | grep qtoggleserver | grep -v $$ | grep -v grep | tr -s ' ' | sed -e 's/^\s//' | cut -d ' ' -f 1 | xargs -r kill -9
}

case "$1" in
    start)
        start
        ;;

    stop)
        stop
        ;;

    restart)
        stop
        start
        ;;

    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $?
