#!/bin/bash

SCRIPT_VER="1.3"

APP="Bazarr"
APP_CATEGORY="Torrent Clients and Utilities"
APP_SCOPE="user"
APP_ENABLED="yes"
STORED_PASSWORD_SERVICE="user"
#><#APP_CHECK_VER_CMD="[ -e "/opt/bazarr/version.id" ] && cat "/opt/bazarr/version.id" || echo """
SUPPORTED_ON="Ubuntu20.04,Ubuntu22.04,Ubuntu24.04"
USE_APACHE2="yes"
DAEMON_PORT=6767
LIBRARY="functions4.sh"

if [ "${SUPPORT-}" = '' ]; then
    SUPPORT="https://installers.rapidseedbox.com/scripts/whmcs_client_installers/support"
fi

LOGFILE="/var/log/whmcs_client_installers/${0}.log"
[ ! -d "/var/log/whmcs_client_installers" ] && mkdir -p "/var/log/whmcs_client_installers"

wget -4 -nc -q --no-check-certificate --timeout=20 --tries=5 ${SUPPORT}/${LIBRARY} >> "${LOGFILE}" 2>&1
if [ ! -f "./${LIBRARY}" ] ; then
    echo "55"
    echo "Error downloading \"${SUPPORT}/${LIBRARY}\"" >> "${LOGFILE}"
    exit 55
fi

# shellcheck source=support/functions4.sh
. "./${LIBRARY}"
SCRIPTENTRY

VALIDATE_USER

APP_DIRECTORY="${USERHOME}/.config/bazarr"
APP_HOME="/opt/bazarr"

while : ; do

    main_rc=1

    CHECK_APP ; _rc=$?
    if [ ${_rc} -ne 0 ] ; then
        main_rc=${_rc}
        break
    fi

    [ -d "${USERHOME}" ] || break

    #
    # https://github.com/morpheus65535/bazarr/
    # https://wiki.bazarr.media/Getting-Started/Installation/Linux/linux/
    #

    APT_UPDATE || break

    if [ ! -e "${APP_HOME}/version.id" ] ; then
        if [ -d "${APP_HOME}" ] ; then
            RM_DIRS "${APP_HOME}"
        fi
        INFO "Installing ${APP} into ${APP_HOME}"
        _ver="$( curl -Ls -m 30 -o /dev/null -w '%{url_effective}' \
                          https://github.com/morpheus65535/bazarr/releases/latest \
                     | awk -F '/' '{print $NF}' | tr -d 'v' )"
        if [ -z "${_ver}" ] ; then
            ERROR "Failed to retrieve ${APP} release tarball URL !"
            break
        else
            APP_URL="https://github.com/morpheus65535/bazarr/releases/latest/download/bazarr.zip"
            INFO "${APP} version: ${_ver}"
            INFO "${APP} release tarball URL: ${APP_URL}"
        fi
        if [ -z "${APP_URL}" ] ; then
            ERROR "Failed to parse ${APP} release tarball URL !"
            break
        else
            APP_ARCHIVE=$( echo "${APP_URL}" | awk -F "/" '{print $NF}' )
            INFO "${APP} release tarball: ${APP_ARCHIVE}"
        fi
        WGET "${APP_URL}" || break
        MKDIR "${APP_HOME}" || break
        UNZIP "${TMP_DIR}/${APP_ARCHIVE}" "${APP_HOME}/" || break
        PIP3_INSTALL " -r ${APP_HOME}/requirements.txt 2>&1" || break

        shebang="#!${RSB_VENV}/${APP_VENV}/bin/python3"
        if head -n1 "${APP_HOME}/bazarr.py" | grep -q '^#!'; then
            sed -i "1s|^#!.*|${shebang}|" "${APP_HOME}/bazarr.py"
        else
            sed -i "1i ${shebang}" "${APP_HOME}/bazarr.py"
        fi
        echo "${_ver}" > "${APP_HOME}/version.id"
        CHOWN_DIR root:root "${APP_HOME}" || break
#        RUN_LOG "find ${APP_HOME} -type d -exec chmod 755 {} \;"
#        RUN_LOG "find ${APP_HOME} -type f -exec chmod 755 {} \;"
    fi

    MKDIR "${APP_DIRECTORY}" || break
    MKDIR "${APP_DIRECTORY}/config" || break
    CHOWN_DIR "${USERNAME}":"${USERNAME}" "${APP_DIRECTORY}" || break
 
    APP_DAEMON_PORT="$(( USERUID + 6767 - FIRST_UID ))"

    cat <<-EOF > "/etc/systemd/system/${APP,,}@.service"
	[Unit]
	Description=${APP} Daemon
	After=syslog.target network.target

	[Service]
	User=%i
	Group=%i
	Type=simple
	ExecStart=${RSB_VENV}/${APP_VENV}/bin/python3 ${APP_HOME}/bazarr.py --config /home/%i/.config/${APP,,}
	TimeoutStopSec=20
	KillMode=control-group
	Restart=on-failure

	[Install]
	WantedBy=multi-user.target
	EOF

    cat <<-EOF > "/etc/systemd/system/${APP,,}.slice" 2>> "${LOGFILE}"
	[Unit]
	Description=${APP} resource limiting
	Before=slices.target

	[Slice]
	CPUAccounting=yes
	CPUQuota=20%
	IOAccounting=yes
	IOReadBandwidthMax=/ 20M
	IOWriteBandwidthMax=/ 20M
	EOF

    [ ! -d "/etc/systemd/system/${APP,,}@.service.d" ] \
        && MKDIR "/etc/systemd/system/${APP,,}@.service.d"

    cat <<-EOF > "/etc/systemd/system/${APP,,}@.service.d/override.conf"
	[Service]
	Slice=${APP,,}.slice
	EOF

    SYSTEMD_RELOAD

    if [ "${USERUID}" = "${FIRST_UID}" ] ; then
        cat <<-EOF > "${APP_DIRECTORY}/config/config.ini"
	[general]
	ip = 127.0.0.1
	port = ${APP_DAEMON_PORT}
	base_url = /${APP,,}
	debug = False
	auto_update = False
	EOF
    else
        cat <<-EOF > "${APP_DIRECTORY}/config/config.ini"
	[general]
	ip = 127.0.0.1
	port = ${APP_DAEMON_PORT}
	base_url = /${APP,,}-${USERNAME}
	debug = False
	auto_update = False
	EOF
    fi
    CHOWN_FILE "${USERNAME}":"${USERNAME}" "${APP_DIRECTORY}/config/config.ini" || break

    SVC_ENABLE "${APP,,}@${USERNAME}" || break
    SVC_START  "${APP,,}@${USERNAME}" || break

    # Configure Apache
    if [ -d "/etc/apache2/userconf-enabled" ] ; then
        [ -e "/etc/apache2/userconf-enabled/${APP,,}-${USERNAME}.conf" ] \
            && RM_FILES "/etc/apache2/userconf-enabled/${APP,,}-${USERNAME}.conf"
        if [ "${USERUID}" = "${FIRST_UID}" ] ; then
            cat <<-EOF > "/etc/apache2/userconf-enabled/${APP,,}-${USERNAME}.conf" 2>> "${LOGFILE}"
		RewriteEngine on
		RewriteRule ^/${APP,,}$ /${APP,,}/ [R=permanent]
		ProxyPreserveHost on
		ProxyPass /${APP,,} http://127.0.0.1:${APP_DAEMON_PORT}/${APP,,} connectiontimeout=5 timeout=300
		ProxyPassReverse /${APP,,} http://127.0.0.1:${APP_DAEMON_PORT}/${APP,,}

		<Location /${APP,,}>
		    Order deny,allow
		    Deny from all
		    Allow from all
		    AuthType Digest
		    AuthName "apache2"
		    AuthDigestProvider file
		    AuthUserFile "/etc/apache2/users.password"
		    Require user ${USERNAME}
		</Location>
		EOF
        else
            cat <<-EOF >> "/etc/apache2/userconf-enabled/${APP,,}-${USERNAME}.conf" 2>> "${LOGFILE}"
		RewriteEngine on
		RewriteRule ^/${APP,,}-${USERNAME}$ /${APP,,}-${USERNAME}/ [R=permanent]
		ProxyPreserveHost on
		ProxyPass /${APP,,}-${USERNAME} http://127.0.0.1:${APP_DAEMON_PORT}/${APP,,}-${USERNAME} connectiontimeout=5 timeout=300
		ProxyPassReverse /${APP,,}-${USERNAME} http://127.0.0.1:${APP_DAEMON_PORT}/${APP,,}-${USERNAME}

		<Location /${APP,,}-${USERNAME}>
		    Order deny,allow
		    Deny from all
		    Allow from all
		    AuthType Digest
		    AuthName "apache2"
		    AuthDigestProvider file
		    AuthUserFile "/etc/apache2/users.password"
		    Require user ${USERNAME}
		</Location>
		EOF
        fi
        SVC_RELOAD "apache2"
    fi


    main_rc=0
    break

done


SCRIPTEXIT
