#!/bin/bash

# Enqueue a backup for every installed app that has backups enabled. Invoked
# once daily by the backup scheduler crontab entry. Each app is handed to
# backupAppSchedule, which queues a task for the processor (WebUI installs) or
# runs the backup inline (terminal-only installs).
backupScheduleEnabledApps()
{
    isHeader "Scheduling backups for enabled applications"

    if [ ! -f "$docker_dir/$db_file" ]; then
        isError "Database not found: $docker_dir/$db_file"
        return 1
    fi

    local app_names=()
    while IFS= read -r name; do
        [[ -z "$name" ]] && continue
        app_names+=("$name")
    done < <(runInstallOp sqlite3 "$docker_dir/$db_file" "SELECT name FROM apps WHERE status = 1;")

    local queued=0
    for name in "${app_names[@]}"; do
        # libreportal (the WebUI) is reproducible — its state rides in the system
        # config snapshot, so it's never scheduled as an app backup.
        [[ "$name" == "libreportal" ]] && continue
        local backup_flag="CFG_${name^^}_BACKUP"
        if [[ "${!backup_flag}" == "true" ]]; then
            backupAppSchedule "$name"
            ((queued++))
        fi
    done

    # Keep the system config fresh on the schedule too (settings + the
    # backup-location creds). Queue it via the task processor on WebUI installs,
    # else run inline — mirroring backupAppSchedule. backupSystemConfig no-ops
    # when no locations are enabled.
    if [[ "$CFG_REQUIREMENT_WEBUI" == "true" ]] && declare -f createTaskFile >/dev/null 2>&1; then
        createTaskFile "libreportal backup system" "backup" "system" \
            && isSuccessful "System config backup task queued" \
            || backupSystemConfig
    else
        backupSystemConfig
    fi

    isSuccessful "Backup scheduling complete — $queued app(s) queued + system config"
}
