#!/bin/bash

resticBackupAppToLocation()
{
    local idx="$1"
    local app_name="$2"
    local manifest_sha="$3"
    local source_path="$containers_dir$app_name"

    if [[ ! -d "$source_path" ]]; then
        isError "Source path missing for $app_name: $source_path"
        return 1
    fi

    resticEnvExport "$idx" || return 1

    local host_tag="${CFG_INSTALL_NAME:-libreportal}"
    local extra_tags=(
        --tag "app=$app_name"
        --tag "host=$host_tag"
        --tag "engine=libreportal"
    )
    [[ -n "$manifest_sha" ]] && extra_tags+=(--tag "manifest=$manifest_sha")

    # On the live path backup_app_start sets $backup_exclude_paths to the raw
    # DB data dirs the dumps replace; keep them out of the snapshot.
    local exclude_args=()
    local p
    while IFS= read -r p; do
        [[ -n "$p" ]] && exclude_args+=(--exclude "$p")
    done <<< "${backup_exclude_paths:-}"

    local loc_name
    loc_name=$(resticLocationName "$idx")
    # Logs go to stderr so this function's stdout is ONLY the snapshot id —
    # the caller captures it with $() and feeds it to verify/retention.
    isNotice "Snapshotting $app_name → $loc_name" >&2
    local output
    output=$(runBackupOp restic backup \
        --host "$host_tag" \
        "${extra_tags[@]}" \
        "${exclude_args[@]}" \
        --exclude-caches \
        --json \
        "$source_path" 2>&1)
    local rc=$?

    local snapshot_id
    snapshot_id=$(echo "$output" | grep -o '"snapshot_id":"[^"]*"' | tail -1 | cut -d'"' -f4)

    if [[ $rc -eq 0 ]]; then
        isSuccessful "Backup created in $loc_name: ${snapshot_id:0:8}" >&2
        echo "$snapshot_id"
    else
        isError "Backup to $loc_name failed for $app_name" >&2
        echo "$output" | tail -10 >&2
    fi

    resticEnvUnset
    return $rc
}

resticBackupSystemToLocation()
{
    local idx="$1"
    local source_path="${configs_dir%/}"

    if [[ ! -d "$source_path" ]]; then
        isError "System config path missing: $source_path"
        return 1
    fi

    resticEnvExport "$idx" || return 1

    local host_tag="${CFG_INSTALL_NAME:-libreportal}"
    local loc_name
    loc_name=$(resticLocationName "$idx")
    isNotice "Snapshotting system config → $loc_name" >&2
    local output
    output=$(runBackupOp restic backup \
        --host "$host_tag" \
        --tag "system=config" \
        --tag "host=$host_tag" \
        --tag "engine=libreportal" \
        --exclude-caches \
        --json \
        "$source_path" 2>&1)
    local rc=$?

    local snapshot_id
    snapshot_id=$(echo "$output" | grep -o '"snapshot_id":"[^"]*"' | tail -1 | cut -d'"' -f4)

    if [[ $rc -eq 0 ]]; then
        isSuccessful "System config backed up to $loc_name: ${snapshot_id:0:8}" >&2
        echo "$snapshot_id"
    else
        isError "System config backup to $loc_name failed" >&2
        echo "$output" | tail -10 >&2
    fi

    resticEnvUnset
    return $rc
}

resticBackupAppAllLocations()
{
    local app_name="$1"
    local manifest_sha="$2"
    local failed=0
    local succeeded=0
    local idx

    while IFS= read -r idx; do
        [[ -z "$idx" ]] && continue
        if resticBackupAppToLocation "$idx" "$app_name" "$manifest_sha" >/dev/null; then
            succeeded=$((succeeded + 1))
        else
            failed=$((failed + 1))
        fi
    done < <(resticEnabledLocations)

    if [[ $succeeded -eq 0 ]]; then
        isError "All backup targets failed for $app_name"
        return 1
    fi
    if [[ $failed -gt 0 ]]; then
        isNotice "Backup of $app_name succeeded on $succeeded location(s), failed on $failed"
    else
        isSuccessful "Backup of $app_name succeeded on $succeeded location(s)"
    fi
    return 0
}
