#!/bin/bash

#
# Name:		relocate-app-data
# Version:      1.0.2
#
# (c) 2023, Rapidseedbox, alexey@rapidseedbox.com
#

set -o pipefail

SC_NAME="$( basename "${0}" )"
_VER="$( grep -m 1 -E '^#\s*Version:\s+' "${0}" | awk '{print $NF}' )"

ALL_APPS="elfinder emby jellyfin nextcloud plex"

ELFINDER_HOME="/var/www/html/elfinder"
EMBY_HOME="/var/lib/emby"
JELLYFIN_HOME="/var/lib/jellyfin"
NEXTCLOUD_HOME="/var/www/nextcloud"
PLEX_HOME="/var/lib/plexmediaserver/Library/Application Support/Plex Media Server"

usage () {
    cat <<-EOF
	Usage:

	  ${SC_NAME} -h | --help
	  ${SC_NAME} -a all
	  ${SC_NAME} -a app[,app2[,app3]]

	  Applications:
	      ${ALL_APPS}
	EOF
}

_rc=0

case "${1}" in
  ""|"-h"|"--help")
      usage
      exit 0
      ;;
  "-a")
      shift
      _apps="${1,,}"
      case "${_apps}" in
        "")
            usage
            exit 1
            ;;
        "all")
            _APPS="${ALL_APPS}"
            ;;
        *)
            _APPS=""
            for _a in $( tr ',' '\n' <<< "${_apps}" ) ; do
                if ! grep -q " ${_a} " <<< " ${ALL_APPS} " ; then
                    echo -ne "\n[${_a}]: Wrong application.\n\n"
                    usage
                    exit 1
                fi
                [ -n "${_APPS}" ] && _APPS="${_APPS} " 
                _APPS="${_APPS}${_a}" 
            done
            ;;
      esac
      ;;
esac


# ---------------------------------------------------- #
# --           Functions                            -- #
# ---------------------------------------------------- #

_relocate_elfinder () {
    local _rc=0
    local _need_restart="no"
    #
    if [ ! -e "${ELFINDER_HOME}" ] ; then
        >&2 echo "${ELFINDER_HOME}: Path not found."
        return 1
    fi
    if [ -L "${ELFINDER_HOME}" ] ; then
        >&2 echo "${ELFINDER_HOME} is a symlink to \"$( readlink -f "${ELFINDER_HOME}" )\""
        return 1
    fi
    #
    # -- Move ELFINDER directory
    echo "Moving '${ELFINDER_HOME}' -> '/data/apps.data/' ..."
    mv -f "${ELFINDER_HOME}" "/data/apps.data/"
    [ -d "${ELFINDER_HOME}" ] && rm -rf "${ELFINDER_HOME}"
    #
    # -- Create symlink
    echo "Creating symlink: '${ELFINDER_HOME}' -> '/data/apps.data/elfinder' ..."
    ln -svf "/data/apps.data/elfinder" "${ELFINDER_HOME}"
    #
    return ${_rc}
}


_relocate_emby () {
    local _rc=0
    local _need_restart="no"
    #
    if ! id "emby" > /dev/null 2>&1 ; then
        >&2 echo "emby: System account not found."
        return 1
    fi
    if [ ! -e "${EMBY_HOME}" ] ; then
        >&2 echo "${EMBY_HOME}: Path not found."
        return 1
    fi
    if [ -L "${EMBY_HOME}" ] ; then
        >&2 echo "${EMBY_HOME} is a symlink to \"$( readlink -f "${EMBY_HOME}" )\""
        return 1
    fi
    #
    # -- Stop `emby-server` if necessary
    if systemctl is-active "emby-server" > /dev/null 2>&1 ; then
        echo "Stopping 'emby-server' service ..."
        _svc stop "emby-server"
        _need_restart="yes"
    fi
    #
    # -- Move EMBY directory
    echo "Moving '${EMBY_HOME}' -> '/data/apps.data/' ..."
    mv -f "${EMBY_HOME}" "/data/apps.data/"
    [ -d "${EMBY_HOME}" ] && rm -rf "${EMBY_HOME}"
    #
    # -- Create symlink
    echo "Creating symlink: '${EMBY_HOME}' -> '/data/apps.data/emby' ..."
    ln -svf "/data/apps.data/emby" "${EMBY_HOME}"
    #
    # -- Restart `emby-server` if necessary
    if [ "${_need_restart}" = "yes" ] ; then
        echo "Restarting 'emby-server' service ..."
        _svc restart "emby-server"
    fi
    #
    return ${_rc}
}


_relocate_jellyfin () {
    local _rc=0
    local _need_restart="no"
    #
    if ! id "jellyfin" > /dev/null 2>&1 ; then
        >&2 echo "jellyfin: System account not found."
        return 1
    fi
    if [ ! -e "${JELLYFIN_HOME}" ] ; then
        >&2 echo "${JELLYFIN_HOME}: Path not found."
        return 1
    fi
    if [ -L "${JELLYFIN_HOME}" ] ; then
        >&2 echo "${JELLYFIN_HOME} is a symlink to \"$( readlink -f "${JELLYFIN_HOME}" )\""
        return 1
    fi
    #
    # -- Stop `jellyfin` if necessary
    if systemctl is-active "jellyfin" > /dev/null 2>&1 ; then
        echo "Stopping 'jellyfin' service ..."
        _svc stop "jellyfin"
        _need_restart="yes"
    fi
    #
    # -- Move JELLYFIN directory
    echo "Moving '${JELLYFIN_HOME}' -> '/data/apps.data/' ..."
    mv -f "${JELLYFIN_HOME}" "/data/apps.data/"
    [ -d "${JELLYFIN_HOME}" ] && rm -rf "${JELLYFIN_HOME}"
    #
    # -- Create symlink
    echo "Creating symlink: '${JELLYFIN_HOME}' -> '/data/apps.data/jellyfin' ..."
    ln -svf "/data/apps.data/jellyfin" "${JELLYFIN_HOME}"
    #
    # -- Restart `jellyfin` if necessary
    if [ "${_need_restart}" = "yes" ] ; then
        echo "Restarting 'jellyfin' service ..."
        _svc restart "jellyfin"
    fi
    #
    return ${_rc}
}


_relocate_nextcloud () {
    local _rc=0
    local _need_restart="no"
    #
    if [ ! -e "${NEXTCLOUD_HOME}" ] ; then
        >&2 echo "${NEXTCLOUD_HOME}: Path not found."
        return 1
    fi
    if [ -L "${NEXTCLOUD_HOME}" ] ; then
        >&2 echo "${NEXTCLOUD_HOME} is a symlink to \"$( readlink -f "${NEXTCLOUD_HOME}" )\""
        return 1
    fi
    #
    # -- Move NEXTCLOUD directory
    echo "Moving '${NEXTCLOUD_HOME}' -> '/data/apps.data/' ..."
    mv -f "${NEXTCLOUD_HOME}" "/data/apps.data/"
    [ -d "${NEXTCLOUD_HOME}" ] && rm -rf "${NEXTCLOUD_HOME}"
    #
    # -- Create symlink
    echo "Creating symlink: '${NEXTCLOUD_HOME}' -> '/data/apps.data/nextcloud' ..."
    ln -svf "/data/apps.data/nextcloud" "${NEXTCLOUD_HOME}"
    #
    return ${_rc}
}


_relocate_plex () {
    local _rc=0
    local _need_restart="no"
    #
    if ! id "plex" > /dev/null 2>&1 ; then
        >&2 echo "plex: System account not found."
        return 1
    fi
    if [ ! -d "${PLEX_HOME}" ] ; then
        >&2 echo "${PLEX_HOME}: Path not found."
        return 1
    fi
    if [ -L "${PLEX_HOME}" ] ; then
        >&2 echo "${PLEX_HOME} is a symlink to \"$( readlink -f "${PLEX_HOME}" )\""
        return 1
    fi
    #
    # -- Stop `plexmediaserver` if necessary
    if systemctl is-active "plexmediaserver" > /dev/null 2>&1 ; then
        echo "Stopping 'plexmediaserver' service ..."
        _svc stop "plexmediaserver"
        _need_restart="yes"
    fi
    #
    # -- Move PLEX directory
    echo "Moving '${PLEX_HOME}' -> '/data/apps.data/' ..."
    mv -f "${PLEX_HOME}" "/data/apps.data/"
    [ -d "${PLEX_HOME}" ] && rm -rf "${PLEX_HOME}"
    #
    # -- Create symlink
    echo "Creating symlink: '${PLEX_HOME}' -> '/data/apps.data/Plex Media Server' ..."
    ln -svf "/data/apps.data/Plex Media Server" "${PLEX_HOME}"
    #
    # -- Restart `plexmediaserver` if necessary
    if [ "${_need_restart}" = "yes" ] ; then
        echo "Restarting 'plexmediaserver' service ..."
        _svc restart "plexmediaserver"
    fi
    #
    return ${_rc}
}



# ---------------------------------------------------- #
# --           Main section                         -- #
# ---------------------------------------------------- #

[ ! -d "/data/apps.data" ] && mkdir -vp "/data/apps.data"

_available_space="$( df -B1 /data/apps.data/ 2> /dev/null | tail -1 | awk '{print $4}' )"
_rc=$?
if [ "${_rc}" != "0" ] ; then
    >&2 echo "!!! Error retrieving disk space information, RC: [${_rc}]"
    exit ${_rc}
elif [ -z "${_available_space}" ] ; then
    >&2 echo "!!! Error retrieving disk space information, RC: [1]"
    exit 1
fi

for _a in ${_APPS} ; do
    echo -ne "\n>>> Processing '${_a}' ...\n"
    _relocate_${_a}
    _rc=$?
done

exit ${_rc}
