#!/bin/sh

# Script Environment Variables
# -------------------------------------------------------------------------------------
# SYNOPKG_PKGNAME               =   Package identify which is defined in INFO
# SYNOPKG_PKGVER                =   Package version which is defined in INFO
# SYNOPKG_PKGDEST               =   Package destination path
#                                   /volume[x]/@appstore/[Package Name]
# SYNOPKG_TEMP_UPGRADE_FOLDER   =   Temporary upgrade folder
#                                   /volume1/@tmp/synopkg.tmp/[Package Name]
# -------------------------------------------------------------------------------------


# Important Paths, soft links and variables
# -------------------------------------------------------------------------------------
# DSM WebGUI folder
# /usr/syno/synoman/webman/3rdparty/[Package Name] -> /var/packages/[Package Name]/target
#WEBGUI_FOLDER="/usr/syno/synoman/webman/3rdparty/${SYNOPKG_PKGNAME}"
# WEBGUI_FOLDER set by synocr_resolve_app_root() below

# Soft link
# /var/packages/[Package Name]/target -> /volume1/@appstore/[Package Name]
PACKAGE_FOLDER="/var/packages/${SYNOPKG_PKGNAME}/target/ui"

# Timestamp - Formatting the Timestamp to terminate log entries
TIMESTAMP=$(date +%Y-%m-%d%t%H:%M:%S)
# -------------------------------------------------------------------------------------

# App root: directory containing upgradeconfig.sh (must NOT require etc/ to exist — postupgrade runs on fresh tree).
synocr_resolve_app_root() {
    if [ -f "${SYNOPKG_PKGDEST}/upgradeconfig.sh" ]; then
        WEBGUI_FOLDER="${SYNOPKG_PKGDEST}"
    elif [ -f "${SYNOPKG_PKGDEST}/ui/upgradeconfig.sh" ]; then
        WEBGUI_FOLDER="${SYNOPKG_PKGDEST}/ui"
    elif [ -d "${SYNOPKG_PKGDEST}/etc" ]; then
        WEBGUI_FOLDER="${SYNOPKG_PKGDEST}"
    elif [ -d "${SYNOPKG_PKGDEST}/ui/etc" ]; then
        WEBGUI_FOLDER="${SYNOPKG_PKGDEST}/ui"
    else
        WEBGUI_FOLDER="${SYNOPKG_PKGDEST}"
    fi
}

# Canonical venv path: alongside app scripts (WEBGUI_FOLDER = .../ui on DSM7).
synocr_python_env_dest() {
    printf '%s/python3_env' "${WEBGUI_FOLDER}"
}

# venv directory: pyvenv.cfg + bin/ (do not require bin/python3 — DSM may only expose bin/python).
synocr_is_venv_dir() {
    [ -d "$1" ] && [ -f "$1/pyvenv.cfg" ] && [ -d "$1/bin" ]
}

synocr_venv_has_interpreter() {
    _p="$1"
    [ -x "${_p}/bin/python3" ] && return 0
    [ -x "${_p}/bin/python" ] && return 0
    for _py in "${_p}"/bin/python3.*; do
        [ -x "${_py}" ] && return 0
    done
    return 1
}

synocr_find_python_env() {
    _candidate=""
    for _candidate in \
        "$(synocr_python_env_dest)" \
        "${SYNOPKG_PKGDEST}/python3_env" \
        "$(dirname "${SYNOPKG_PKGDEST}")/python3_env" \
        "/usr/syno/synoman/webman/3rdparty/${SYNOPKG_PKGNAME}/python3_env" \
        "/usr/syno/synoman/webman/3rdparty/${SYNOPKG_PKGNAME}/ui/python3_env"
    do
        if synocr_is_venv_dir "${_candidate}"; then
            printf '%s' "${_candidate}"
            return 0
        fi
    done
    return 1
}

synocr_log_python_env_probe() {
    _candidate=""
    echo "${TIMESTAMP} - python3_env probe (venv-migrate-v5):" >> /tmp/${SYNOPKG_PKGNAME}.history
    echo "  SYNOPKG_PKGDEST=${SYNOPKG_PKGDEST}" >> /tmp/${SYNOPKG_PKGNAME}.history
    echo "  WEBGUI_FOLDER=${WEBGUI_FOLDER}" >> /tmp/${SYNOPKG_PKGNAME}.history
    echo "  canonical=$(synocr_python_env_dest)" >> /tmp/${SYNOPKG_PKGNAME}.history
    echo "  SYNOPKG_TEMP_UPGRADE_FOLDER=${SYNOPKG_TEMP_UPGRADE_FOLDER}" >> /tmp/${SYNOPKG_PKGNAME}.history
    for _candidate in \
        "$(synocr_python_env_dest)" \
        "${SYNOPKG_PKGDEST}/python3_env" \
        "$(dirname "${SYNOPKG_PKGDEST}")/python3_env" \
        "/usr/syno/synoman/webman/3rdparty/${SYNOPKG_PKGNAME}/python3_env" \
        "/usr/syno/synoman/webman/3rdparty/${SYNOPKG_PKGNAME}/ui/python3_env"
    do
        if synocr_is_venv_dir "${_candidate}"; then
            echo "  FOUND venv: ${_candidate}" >> /tmp/${SYNOPKG_PKGNAME}.history
            ls -la "${_candidate}" >> /tmp/${SYNOPKG_PKGNAME}.history 2>&1
            ls -la "${_candidate}/bin" >> /tmp/${SYNOPKG_PKGNAME}.history 2>&1
        else
            echo "  missing: ${_candidate}" >> /tmp/${SYNOPKG_PKGNAME}.history
        fi
    done
    df -h "${SYNOPKG_TEMP_UPGRADE_FOLDER}" >> /tmp/${SYNOPKG_PKGNAME}.history 2>&1
}

# Move/copy directory to an explicit destination path (avoids mv-into-parent nesting).
synocr_relocate_to_path() {
    _src="$1"
    _dest="$2"
    if [ ! -d "${_src}" ]; then
        return 1
    fi
    mkdir -p "$(dirname "${_dest}")"
    [ -e "${_dest}" ] && rm -rf "${_dest}"
    if mv "${_src}" "${_dest}" 2>/dev/null; then
        return 0
    fi
    if cp -a "${_src}" "${_dest}" 2>/dev/null; then
        rm -rf "${_src}"
        return 0
    fi
    return 1
}

# mv within same volume; cp -a fallback when @tmp and @appstore differ.
synocr_relocate_dir_into() {
    _src="$1"
    _dest_parent="$2"
    _base=$(basename "${_src}")
    synocr_relocate_to_path "${_src}" "${_dest_parent}/${_base}"
}
synocr_resolve_app_root

# Action...
# -------------------------------------------------------------------------------------
echo '${TIMESTAMP} - Start package update --> ${SYNOPKG_PKGNAME} ${SYNOPKG_PKGVER}' >>/tmp/${SYNOPKG_PKGNAME}.history
echo '------------------------------------------------------------------------------------------------------------------------------------------' >>/tmp/${SYNOPKG_PKGNAME}.history

echo "WEBGUI_FOLDER: ${WEBGUI_FOLDER}/etc" >>/tmp/${SYNOPKG_PKGNAME}.history

# -------------------------------------------------------------------------------------
# select language (sourced early so language strings are available for all checks below):
    if [ -f $(/usr/bin/dirname $0)/lang/${SYNOPKG_DSM_LANGUAGE} ] ; then
         . $(/usr/bin/dirname $0)/lang/${SYNOPKG_DSM_LANGUAGE}
    else
         . $(/usr/bin/dirname $0)/lang/enu
    fi

# on aarch64 at least Python 3.9 must be available
# (reason: see prepare_python in APP/ui/synOCR.sh - dateparser dependency backports.zoneinfo)
machinetyp=$(uname --machine)
if [ "${machinetyp}" = "aarch64" ]; then
    python_ok=0
    for py in /bin/python3.* /usr/bin/python3.* /usr/local/bin/python3.*; do
        [ -x "$py" ] || continue
        ver=$("$py" -c "import sys; print('%d.%d' % sys.version_info[:2])" 2>/dev/null)
        [ -z "$ver" ] && continue
        major=${ver%%.*}
        minor=${ver#*.}
        if [ "$major" -gt 3 ] || { [ "$major" -eq 3 ] && [ "$minor" -ge 9 ]; }; then
            python_ok=1
            break
        fi
    done

    if [ "$python_ok" -eq 0 ]; then
        echo "${PKG_NOINSTALL_PYTHON_AARCH64_ERROR}" > $SYNOPKG_TEMP_LOGFILE

        exit 1
    fi
fi

# backup config:
if [ -d "${WEBGUI_FOLDER}/etc" ]; then
    [ ! -d "${SYNOPKG_TEMP_UPGRADE_FOLDER}/etc" ] && mkdir -p -m 755 ${SYNOPKG_TEMP_UPGRADE_FOLDER}/etc
    cp -rf ${WEBGUI_FOLDER}/etc/* ${SYNOPKG_TEMP_UPGRADE_FOLDER}/etc
    echo ''${TIMESTAMP}' - Backup the SQLite database from '${WEBGUI_FOLDER}'/etc to '${SYNOPKG_TEMP_UPGRADE_FOLDER}'/etc' >> /tmp/${SYNOPKG_PKGNAME}.history

    echo "stored source files:" >> /tmp/${SYNOPKG_PKGNAME}.history
    ls -la ${WEBGUI_FOLDER}/etc >> /tmp/${SYNOPKG_PKGNAME}.history

    echo "stored target files:" >> /tmp/${SYNOPKG_PKGNAME}.history
    ls -la ${SYNOPKG_TEMP_UPGRADE_FOLDER}/etc >> /tmp/${SYNOPKG_PKGNAME}.history
else
    echo '${TIMESTAMP} - Backup of SQLite database failed' >> /tmp/${SYNOPKG_PKGNAME}.history
    exit 1
fi

# backup python environment:
synocr_log_python_env_probe
PYTHON_ENV=""
PYTHON_ENV=$(synocr_find_python_env) || PYTHON_ENV=""
if [ -n "${PYTHON_ENV}" ]; then
    if synocr_relocate_to_path "${PYTHON_ENV}" "${SYNOPKG_TEMP_UPGRADE_FOLDER}/python3_env"; then
        echo "${TIMESTAMP} - Backup python3_env from ${PYTHON_ENV} to ${SYNOPKG_TEMP_UPGRADE_FOLDER}/python3_env" >> /tmp/${SYNOPKG_PKGNAME}.history
    else
        echo "${TIMESTAMP} - Backup python3_env failed (mv/cp) from ${PYTHON_ENV} — vEnv will be rebuilt on next run" >> /tmp/${SYNOPKG_PKGNAME}.history
    fi
else
    echo "${TIMESTAMP} - Backup python3_env skipped: not found (canonical: $(synocr_python_env_dest))" >> /tmp/${SYNOPKG_PKGNAME}.history
fi

# upgrade notices (timer, backup rotation) for Package Center:
pkg_upgrade_notice=""

if [[ $(printf "1.1.999\n${SYNOPKG_OLD_PKGVER}" | sort -V | tail -n1) = "1.1.999" ]]; then
    pkg_upgrade_notice="${PKG_DELETE_TIMER}"
fi

if [[ $(printf "1.5.99.6\n${SYNOPKG_OLD_PKGVER}" | sort -V | tail -n1) = "1.5.99.6" ]]; then
    backup_notice="⚠️ ${PKG_UPGRADE_BACKUP_ROTATION_TITLE}: ${PKG_UPGRADE_BACKUP_ROTATION_BODY}"
    if [ -n "${pkg_upgrade_notice}" ]; then
        pkg_upgrade_notice="${pkg_upgrade_notice}

${backup_notice}"
    else
        pkg_upgrade_notice="${backup_notice}"
    fi
fi

[ -n "${pkg_upgrade_notice}" ] && echo "${pkg_upgrade_notice}" > "${SYNOPKG_TEMP_LOGFILE}"

# check docker:
if [ ! -e "/var/run/docker.sock" ]; then
    echo "${PKG_NOINSTALL_MISSING_DOCKER_ERROR}" > $SYNOPKG_TEMP_LOGFILE
    exit 1
fi

exit 0