#!/bin/bash
#
# shellcheck disable=SC1091,SC2053,SC2086,SC2162
#
# Copyright (c) 2023-2026 openmediavault plugin developers
#
# This file is licensed under the terms of the GNU General Public
# License version 2. This program is licensed "as is" without any
# warranty of any kind, whether express or implied.
#
# version: 0.3.0

. /usr/share/openmediavault/scripts/helper-functions

export LC_ALL=C.UTF-8

declare -i count=0
declare -i index=0

email_mode=""
email_comment=""
filter=""
postbackup=""
prebackup=""
uuid=""

# logging location
logDir="/var/log/"
logFile="${logDir}/omv-compose-backup.log"

_log()
{
  msg=${1}
  echo "[$(date +'%Y-%m-%d %H:%M:%S%z')] [composebackup] ${msg}" | tee -a ${logFile} >&2
}

# loop through options
while [[ $# -gt 0 ]]; do
  case "$1" in
    -f)
      filter="$2"
      shift 2
      ;;
    -u)
      uuid="$2"
      _log "uuid :: ${uuid}"
      shift 2
      ;;
    -e)
      email_mode="$2"
      shift 2
      ;;
    -c)
      email_comment="$2"
      shift 2
      ;;
    -h)
      echo "Use the following flags:"
      echo "  -f 'filter'"
      echo "    will be used over filter specified without -f flag"
      echo "  -h"
      echo "    show this help"
      echo "  -u uuid of job"
      echo ""
      echo "Examples:"
      echo "  omv-compile-backup-multi -u '41f4e112-cda9-11ee-938c-6715fcf387b0'"
      echo "  omv-compile-backup-multi -f '*' -u '41f4e112-cda9-11ee-938c-6715fcf387b0'"
      echo "  omv-compile-backup-multi -f 'tst' -u '41f4e112-cda9-11ee-938c-6715fcf387b0'"
      echo "  omv-compile-backup-multi -f 'tst1,tst2,tst3' -u '41f4e112-cda9-11ee-938c-6715fcf387b0'"
      echo "  omv-compile-backup-multi tst"
      echo ""
      exit 100
      ;;
    -*)
      echo "Invalid option: $1"
      exit 1
      ;;
    *)
      # if no dash in front, treat as a filter
      if [[ -z "${filter}" ]]; then
        filter="$1"
      fi
      shift
      ;;
  esac
done

if [[ "${filter}" == "*" ]]; then
  filter=""
elif [[ "${filter}" == *","* ]]; then
  filter="@(${filter//,/|})"
fi

excludefilter=""
if omv_isuuid "${uuid}"; then
  excludefilter="$(omv_config_get "/config/services/compose/jobs/job[uuid='${uuid}']/excludefilter")"
fi
if [[ "${excludefilter}" == *","* ]]; then
  excludefilter="@(${excludefilter//,/|})"
fi

tmpfile=""
if [ -n "${email_mode}" ]; then
  tmpfile=$(mktemp)
  exec > "${tmpfile}" 2>&1
fi

_send_email() {
  local rc="$1"
  if [ -n "${tmpfile}" ] && [ -f "${tmpfile}" ]; then
    if [ "${email_mode}" = "always" ] || { [ "${email_mode}" = "onerror" ] && [ "${rc}" -ne 0 ]; }; then
      mail -E -s "Cron${email_comment:+ - ${email_comment}}" -a "From: Cron Daemon <root>" root < "${tmpfile}" > /dev/null 2>&1
    fi
    rm -f "${tmpfile}"
  fi
}
trap '_send_email $?' EXIT

_log "filter :: ${filter}"
_log "excludefilter :: ${excludefilter}"

if omv_isuuid "${uuid}"; then
  job="/config/services/compose/jobs/job[uuid='${uuid}']"
  prebackup=$(omv_config_get "${job}/prebackup")
  postbackup=$(omv_config_get "${job}/postbackup")
fi

# execute pre-backup
if [ -f "${prebackup}" ] && [ -x "${prebackup}" ]; then
  _log "Executing pre-backup script :: ${prebackup}"
  ${prebackup}
  _log "pre-backup script complete."
else
  if [ -n "${prebackup}" ]; then
    _log "pre-backup script not found."
  fi
fi

# Get the shared folder reference and path
sfref=$(omv_config_get "/config/services/compose/sharedfolderref")
if ! omv_isuuid "${sfref}"; then
  _log "No compose sharedfolder set."
  exit 11
fi
sfpath="$(omv_get_sharedfolder_path "${sfref}")"
if [ ! -d "${sfpath}" ]; then
  _log "Shared folder directory does not exist.  Exiting..."
  exit 12
fi
sfpath="${sfpath/%\/}"
sfpath="${sfpath//\/\//\/}"
_log "Compose file path :: ${sfpath}"

# Get the backup shared folder reference and path
sfref=$(omv_config_get "/config/services/compose/backupsharedfolderref")
if ! omv_isuuid "${sfref}"; then
  _log "No backup sharedfolder set."
  exit 13
fi
backuppath="$(omv_get_sharedfolder_path "${sfref}")"
if [ ! -d "${backuppath}" ]; then
  _log "Backup shared folder directory does not exist.  Exiting..."
  exit 14
fi
backuppath="${backuppath/%\/}"
backuppath="${backuppath//\/\//\/}"
_log "Backup path :: ${backuppath}"

# backup global.env
globalenv="${sfpath}/global.env"
if [ -f "${globalenv}" ]; then
  _log "Backup global.env..."
  cp -pv "${globalenv}" "${backuppath}/"
fi

overall_rc=0
xpath="/config/services/compose/files/file"
count=$(omv_config_get_count "${xpath}")
index=1
while [ ${index} -le ${count} ]; do
  pos="${xpath}[position()=${index}]"
  name=$(omv_config_get "${pos}/name")
  if [ -n "${filter}" ] && [[ "${name}" != ${filter} ]]; then
    index=$(( index + 1 ))
    continue
  fi
  if [ -n "${excludefilter}" ] && [[ "${name}" == ${excludefilter} ]]; then
    _log "Skipping '${name}' - matched exclude filter"
    index=$(( index + 1 ))
    continue
  fi
  echo ${name}
  omv-compose-backup "${name}" "${uuid:+${uuid}}" || overall_rc=$?
  index=$(( index + 1 ))
done

# execute post-backup
if [ -f "${postbackup}" ] && [ -x "${postbackup}" ]; then
  _log "Executing post-backup script :: ${postbackup}"
  ${postbackup}
  _log "post-backup script complete."
else
  if [ -n "${postbackup}" ]; then
    _log "post-backup script not found."
  fi
fi

exit "${overall_rc}"
