#!/bin/bash
# This file is part of The RetroPie Project
# 
# The RetroPie Project is the legal property of its developers, whose names are
# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source.
# 
# See the LICENSE.md file at the top-level directory of this distribution and 
# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md
#

## config / defaults
user="USERTOBECHOSEN"

home="$(eval echo ~$user)"
rootdir="/opt/retropie"
retropie_path="$home/RetroPie"

usb_path="$UM_MOUNTPOINT/retropie"
usb_path_from_rp="$usb_path/configs/from_retropie"
usb_path_to_rp="$usb_path/configs/to_retropie"

declare -A path_mapping

# mapping from usb_path_to_rp/* to retropie location
path_mapping["configs"]="$rootdir/configs"

## internals
hook_name=${0##*/}

## functions
function log() {
    logger -p user.$1 -t usbmount-"$hook_name"-[$$] -- "$2"
}

function log_cmd() {
    local ret
    local error
    error="$("$@" 2>&1 >/dev/null)"
    ret=$?
    [[ "$ret" -ne 0 ]] && log err "$* - returned $ret - $error"
}

## some sanity checking
if [[ -z "$UM_MOUNTPOINT" ]]; then
    log err "UM_MOUNTPOINT not set!"
    exit 0
fi

if [[ ! -d "$UM_MOUNTPOINT" ]]; then
    log err "UM_MOUNTPOINT is not a directory"
    exit 0
fi

# make sure we have something to sync from
if [[ ! -d "$usb_path" ]]; then
    exit 0
fi

# make folders for syncing
mkdir -p "$usb_path/"{roms,BIOS} "$usb_path_from_rp" "$usb_path_to_rp"

# mirror romdir structure to external drive
log info "Attempting to create directory structure for ROMS in '$usb_path/roms' ..."
# fetch list of romdirs from current installation and mirror onto external drive
find "$retropie_path/roms" -mindepth 1 -maxdepth 1 -type d -printf "$usb_path/roms/%f\n" | xargs mkdir -p 2>/dev/null || true

# copy ROMs/BIOS from USB stick to local SD card
for dir in roms BIOS; do
    log info "Syncing $dir ..."
    log_cmd rsync -rtu --exclude '._*' --max-delete=-1 "$usb_path/$dir" "$retropie_path/"
    chown -R $user:$user "$retropie_path/$dir"
done

log info "Syncing configs ..."
# copy configs to usb
for to in "${!path_mapping[@]}"; do
    from=${path_mapping[$to]}
    log_cmd rsync -rtu --exclude '._*' --max-delete=-1 "$from/" "$usb_path_from_rp/$to/"
done

# copy configs from usb
for from in $(find "$usb_path_to_rp/" -mindepth 1 -maxdepth 1); do
    # basename
    from_bn=${from##*/}
    to=${path_mapping[$from_bn]}
    if [[ -n "$to" ]]; then
        log_cmd rsync -rtu --exclude '._*' --max-delete=-1 "$from/" "$to/"
        chown -R $user:$user "$to"
    fi
done

# unmount USB stick
umount "$UM_MOUNTPOINT"
