#!/bin/bash

if [[ -z $1 ]]; then
    echo "Usage: $0 backup_dir"
    exit 2
fi
backup_dir=$1

# get name of world loaded into server
world=$(grep ^level-name= "/home/mcadmin/server.properties" | cut -d = -f 2- -s)
# check if world name is empty
if [[ -z $world ]]; then
    echo "Error: world-name field seems to be empty. Check server.properties file."
    exit 1
fi
worlds_dir="/home/mcadmin/worlds"
if [[ ! -d "$worlds_dir/$world" ]]; then
    echo "Error: world \"$world\" not found in $worlds_dir. Check server.properties file as well."
    exit 1
fi

# Check if backup dir already exists
if [[ -e "$backup_dir" ]]; then
    echo "Error: backup dir already exists. Delete directory before proceeding or use another directory name."
    exit 1
fi
echo "Creating directory \"$backup_dir\"..."
mkdir -p "$backup_dir"
cd "$backup_dir"

# Check if server is active
status=$(systemctl show mcbe -p ActiveState --value)
# if service is not active, just rsync folder directly.
if [[ $status != active ]]; then
    echo "Server is inactive: copying files directly..."
    rsync -a "$worlds_dir/" ./
    exit
fi

# prepare backup of active world
echo "Server is active: running save hold command..."
status=$(mcbe-exec save hold)
if [[ $status == "The command is already running" ]]; then
    echo "Error: a save seems to be currently in progress. Did the previous save run correctly?"
    mcbe-exec save resume
    exit 1
fi
timeout=0
buffer=$(mcbe-exec save query)
until echo "$buffer" | grep -q 'Data saved'; do
    # 1 minute timeout
    if [[ "$timeout" -eq 60 ]]; then
	echo "Error: save timed out."
	mcbe-exec save resume
	exit 1
    fi
    sleep 1
    timeout=$(( ++timeout ))
    buffer=$(mcbe-exec save query)
done
files=$(echo "$buffer" | grep -Eo "${world}[^:]+:[0-9]+")

# copy files for active world
echo "Copying active world..."
echo "$files" | while read -r line; do
    file=${line%:*}
    size=${line#*:}
    mkdir -p "$(dirname "$file")"
    rsync -a "$worlds_dir/$file" "$file"
    truncate --size="$size" "$file"
done

# tell minecraft it can resume
mcbe-exec save resume

# copy inactive worlds
echo "Copying inactive worlds..."
ls -w 1 "$worlds_dir" | grep -v -E "^$world\$" | while read -r line; do
    rsync -a "$worlds_dir/$line" ./
done

# make sure everything is owned by worlds owner
chown -R "$(stat -c %U:%G $worlds_dir)" ./

echo "Done!"