#!/bin/sh

PKG_LIB_DIR="/usr/lib/games/dwarf-fortress"
PKG_DATA_DIR="/usr/share/games/dwarf-fortress/gamedata"
LOCAL_DATA_DIR="/usr/local/share/games/dwarf-fortress"
USER_DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dwarf-fortress"

X_ERROR_TEXT="An error occured while preparing the environment for \
Dwarf Fortress. The full error output can be found in %s"

OLD_RUN_DIR="$USER_DATA_DIR/run"
OLD_USER_DATA_DIR="$USER_DATA_DIR/data"

if [ ! -d "$USER_DATA_DIR" ]
then
    mkdir -m 700 -p "$USER_DATA_DIR"
fi

if [ -d "$OLD_RUN_DIR" ]
then
    BACKUP="${XDG_DATA_HOME:-$HOME/.local/share}/dwarf-fortress.old"
    mkdir -m 700 -pv "$BACKUP"
    mv -v "$USER_DATA_DIR/data" "$USER_DATA_DIR/run" "$BACKUP"
    cp -av "$BACKUP"/data/* "$USER_DATA_DIR"
    mkdir -pv "$USER_DATA_DIR/data/save"
    cp -av "$BACKUP"/run/data/save/* "$USER_DATA_DIR/data/save/"
fi

if [ ! -d "$LOCAL_DATA_DIR" ]
then
    LOCAL_DATA_DIR=
fi

RUN_DIR="$(mktemp --tmpdir -d "dwarf-fortress.run.XXXXXXXXXX")"
unionfs -o cow,relaxed_permissions \
        "$USER_DATA_DIR=rw:$PKG_LIB_DIR:$LOCAL_DATA_DIR:$PKG_DATA_DIR" \
        "$RUN_DIR"

# Fixup now broken symlink with relative path
rm -v "$RUN_DIR/data/art/font.ttf"
ln -vs /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf "$RUN_DIR/data/art/font.ttf"

# df doesn't mind being called with superfluous arguments
"$RUN_DIR/df" "$@"

fusermount -u "$RUN_DIR"
rmdir "$RUN_DIR"

# Clean up user data dir after it got more data than necessary
rm -v "$USER_DATA_DIR/data/art/font.ttf"
find "$USER_DATA_DIR" -type f -printf '%P\n' |
    while IFS= read -r path
    do
        if diff -q "$PKG_DATA_DIR/$path" "$USER_DATA_DIR/$path" \
           > /dev/null 2> /dev/null
        then
            rm -v "$USER_DATA_DIR/$path"
        fi
    done
