#!/bin/bash

usage () {
    cat <<EOF
Usage: $0 [dump|restore|help] [container|dbfile] [dbfile|container] [folder]
Subcommands:
	dump		Dump dashboard database from container
	restore		Restore dashboard records into container
	help 		Print this usage

Parameters:
	container	ID or name of docker container
	dbfile		Database file
	folder		Folder of dashboards, default is "Alerts"

Examples:
	$0 dump pmm ./grafana.db
	$0 restore ./grafana.db pmm Alerts
	$0 help
EOF

	exit 1
}

# dashboard folder to be dumped
FOLDER="Alerts"

function join_by {
  local d=${1-} f=${2-}
  if shift 2; then
    printf %s "$f" "${@/#/$d}"
  fi
}

insert_records() {
	local dbfile=$1
	local dest=$2

	local tmpfile=$(mktemp)
	trap "rm -f ${tmpfile} && docker exec -it ${dest} sh -c \"rm -f ${tmpfile}\"" EXIT	# remove tmp file after exit

	# dump and restore the folder record first
	ori_folder_id=$(sqlite3 $dbfile "SELECT id FROM dashboard WHERE \`title\` = '${FOLDER}' AND is_folder = 1;" | tr -d "\r\n")
	sqlite3 $dbfile ".headers on" ".mode insert dashboard" ".output ${tmpfile}" "SELECT version, slug, title, data, org_id, created, updated, updated_by, created_by, gnet_id, plugin_id, folder_id, is_folder, has_acl, uid FROM dashboard WHERE \`title\` = '${FOLDER}' AND is_folder=1;" ".quit"
	docker cp ${tmpfile} ${dest}:${tmpfile}
	docker exec -it ${dest} sh -c "cat ${tmpfile} | sqlite3 /var/lib/grafana/grafana.db" || true

	# update folder_id to new inserted folder_id
	folder_id=$(docker exec -it ${dest} sh -c "sqlite3 /var/lib/grafana/grafana.db \"SELECT id FROM dashboard WHERE \\\`title\\\` = '${FOLDER}' AND is_folder = 1;\"" | tr -d "\r\n")
	sqlite3 $dbfile "UPDATE dashboard SET folder_id = ${folder_id} WHERE folder_id = ${ori_folder_id}"

	# restore dashboard records
	sqlite3 $dbfile ".headers on" ".mode insert dashboard" ".output ${tmpfile}" "SELECT version, slug, title, data, org_id, created, updated, updated_by, created_by, gnet_id, plugin_id, folder_id, is_folder, has_acl, uid FROM dashboard WHERE folder_id = ${folder_id};" ".quit"
	docker cp ${tmpfile} ${dest}:${tmpfile}
	docker exec -it ${dest} sh -c "cat ${tmpfile} | sqlite3 /var/lib/grafana/grafana.db"
}

shell_quote_string() {
  echo "$1" | sed -e 's,\([^a-zA-Z0-9/_.=-]\),\\\1,g'
}

main() {
	local src=$2
	local dest=$3
	local folder=$4

	case $1 in
		dump)
			docker cp ${src}:/var/lib/grafana/grafana.db $dest
			;;
		restore)
			if [ -n "$folder" ]; then
				FOLDER=$folder
			fi

			insert_records $src $dest
			;;
		*)
			usage
			;;
	esac
}

main $@
