#!/bin/bash

# Discovery helpers for cross-host migrate. All read-only — they query a
# backup location's snapshot index, never touch live state.
#
# Three views, increasing specificity:
#   migrateDiscoverHosts       — which hosts have snapshots in this location?
#   migrateDiscoverApps        — which apps does <host> have in this location?
#   migrateDiscoverAppDetail   — newest snapshot + count for one host/app.

# Resolve to the first enabled location when idx is unset. Returns "" if
# nothing is enabled — callers should treat that as "nowhere to discover from."
_migrateResolveLocation()
{
    local idx="$1"
    if [[ -z "$idx" ]]; then
        idx=$(resticEnabledLocations | head -1)
    fi
    echo "$idx"
}

# List hostnames with at least one snapshot in the given location. One per line.
migrateDiscoverHosts()
{
    local idx
    idx=$(_migrateResolveLocation "$1")
    [[ -z "$idx" ]] && return 1

    engineSnapshotsJson "$idx" 2>/dev/null \
        | grep -o '"hostname":"[^"]*"' \
        | sort -u \
        | cut -d'"' -f4
}

# List apps backed up by <host> in this location. One slug per line.
migrateDiscoverApps()
{
    local idx
    idx=$(_migrateResolveLocation "$2")
    local host="$1"
    [[ -z "$idx" || -z "$host" ]] && return 1

    engineSnapshotsJson "$idx" "" "$host" 2>/dev/null \
        | grep -o '"app=[^"]*"' \
        | sort -u \
        | sed 's/"app=\(.*\)"/\1/'
}

# JSON detail for one host+app: snapshot count + latest id/date.
# Output: {"host":"…","app":"…","snapshots":N,"latest_id":"…","latest_date":"…"}
# Missing snapshots → snapshots=0, latest_*=null.
migrateDiscoverAppDetail()
{
    local host="$1"
    local app="$2"
    local idx
    idx=$(_migrateResolveLocation "$3")
    [[ -z "$idx" || -z "$host" || -z "$app" ]] && return 1

    local json
    json=$(engineSnapshotsJson "$idx" "$app" "$host" 2>/dev/null)

    local count
    count=$(printf '%s' "$json" | grep -oc '"short_id":"' || echo 0)

    local latest_id="null"
    local latest_date="null"
    if (( count > 0 )); then
        # Restic prints snapshots in creation order — last one is newest.
        latest_id="\"$(printf '%s' "$json" \
            | grep -o '"short_id":"[^"]*"' | tail -1 | cut -d'"' -f4)\""
        latest_date="\"$(printf '%s' "$json" \
            | grep -o '"time":"[^"]*"' | tail -1 | cut -d'"' -f4)\""
    fi

    printf '{"host":"%s","app":"%s","loc_idx":%s,"snapshots":%s,"latest_id":%s,"latest_date":%s}\n' \
        "$host" "$app" "$idx" "$count" "$latest_id" "$latest_date"
}

# Back-compat shim — older callers (and the existing CLI) used this name with
# (idx, host) arg order. New code should call migrateDiscoverApps directly.
migrateDiscoverAppsForHost()
{
    local idx="$1"
    local host="$2"
    migrateDiscoverApps "$host" "$idx"
}
