#!/usr/bin/bash

PROGNAME=${0##*/}

function _log() {
    local now=$(date +%Y-%m-%dT%H:%M:%S.%3N%:z)
    local LOGGER_SEVERITY=${LOGGER_SEVERITY:-info}
    local STDOUT_LABEL=${STDOUT_LABEL:-INFO}
    [[ -t 0 ]] || logger -t "$PROGNAME[$$]" -p "$LOGGER_SEVERITY" -- "$*"
    echo "$now $STDOUT_LABEL $PROGNAME: $*"
}
function info() { LOGGER_SEVERITY=info STDOUT_LABEL=INFO _log "$@"; }
function fatal() { LOGGER_SEVERITY=crit STDOUT_LABEL=FATAL _log "$@"; exit 2; }

source /etc/profile.d/kompot-path.sh ||
    fatal 'Failed to source /etc/profile.d/kompot-path.sh'

if [[ -f /var/lib/grafana/grafana.db ]]; then
    ndashboard=$(sqlite3 /var/lib/grafana/grafana.db 'select count(*) from dashboard')
    if [[ $ndashboard -gt 0 && $FORCE != 1 ]]; then
        [[ -z $CHECK_QUIET ]] && info 'Database not empty, need force to continue'
        exit 0
    fi
fi

zservice status grafana-server >/dev/null
initial_service_status=$?

if [[ $RESET == 1 ]]; then
    zservice stop grafana-server
    rpm -e --nodeps grafana
    find /var/lib/grafana/ -mindepth 1 -maxdepth 1 -exec rm -rfv {} +
    rm -rfv /etc/grafana
    dnf install -y "grafana${GRAFANA_VERSION:+-$GRAFANA_VERSION}"
fi

# start grafana if not already running to make it initialize its database
if ! zservice status grafana-server >/dev/null; then
    info 'Start grafana'
    zservice start grafana-server
fi
sleep 1
zservice status grafana-server >/dev/null ||
    fatal 'Service grafana-server did not start'

ts=$(date +%s)
wait=0
last_size=
last_migration=
size_stable=0
migration_stable=0

while (( wait++ < 90 )); do
    info "Wait database ready, try=$wait, size_stable=$size_stable, migration_stable=$migration_stable"
    sleep 1
    [[ -f /var/lib/grafana/grafana.db ]] || continue
    cur_size=$(stat -c %s /var/lib/grafana/grafana.db 2>/dev/null)
    cur_migration=$(sqlite3 /var/lib/grafana/grafana.db 'select max(id) from migration_log' 2>/dev/null)
    if [[ $cur_migration == $last_migration ]]; then
        (( migration_stable++ ))
    else
        last_migration=$cur_migration
        migration_stable=0
    fi
    if [[ $cur_size == $last_size ]]; then
        (( size_stable++ ))
    else
        last_size=$cur_size
        size_stable=0
    fi
    (( migration_stable > 8 && size_stable > 8 )) && { wait=0; break; }
done
(( wait == 0 )) || fatal 'Database not ready, timeout'

info 'Stop grafana'
zservice stop grafana-server

cp -a /var/lib/grafana/grafana.db{,".$ts"}
for sql in ${0%/*}/*-grafana-*.sql; do
    info "Apply ${sql##*/}"
    if ! sqlite3 /var/lib/grafana/grafana.db < "$sql"; then
        cp -a /var/lib/grafana/grafana.db{".$ts",}
        fatal "Update failed, abort"
    fi
done

info 'Update configuration'
cp -a /etc/grafana/grafana.ini{,".$ts"}
install -m 640 -g grafana /opt/kompot/share/configs/grafana/grafana.ini /etc/grafana/grafana.ini

if [[ $initial_service_status == 0 ]]; then
    info 'Start grafana'
    zservice start grafana-server
fi
