#!/usr/bin/env bash
# onx-backup-push-restic — yedek dosyasını bir restic deposuna yükle (dedup + şifreli).
#
# Input (stdin JSON):
#   {
#     "local_path": "/var/backups/onoxsoft/.../backup.tar.gz",
#     "destination_id": 9,
#     "config": {
#       "repo":     "/mnt/restic | rest:https://u:p@host/ | sftp:user@host:/path | s3:...",
#       "password": "restic depo şifresi"
#     },
#     "day": "2026-06-02"          # optional; --tag olarak işaretlenir
#   }
# Output (stdout JSON):
#   {"uploaded":true,"remote_path":"restic:<snapshot_id>","bytes":N,"duration_seconds":N,"snapshot_id":"..."}
#
# NOT: repo s3:/sftp: ise backend kimlik bilgileri repo URL'inde / SSH config'te olmalı
# (model yalnız repo+password tutar). Local/rest:/sftp(key) en yaygın senaryolar.
# Depo başlatılmamışsa ilk push otomatik 'restic init' yapar.
# Deployed to: /usr/local/onoxsoft/bin/onx-backup-push-restic

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/_lib/common.sh"

require_root
require_cmd restic
onx_json_input

LOCAL_PATH="$(onx_json_field local_path)"
CONFIG="$(echo "$INPUT" | jq -c '.config // {}')"

[[ -z "$LOCAL_PATH" ]] && onx_die 1 "local_path zorunlu"
[[ ! -f "$LOCAL_PATH" ]] && onx_die 2 "Dosya bulunamadı: ${LOCAL_PATH}"

REPO="$(onx_json_get "$CONFIG" repo '')"
PASSWORD="$(onx_json_get "$CONFIG" password '')"

[[ -z "$REPO" ]]     && onx_die 1 "config.repo zorunlu (restic deposu)"
[[ -z "$PASSWORD" ]] && onx_die 1 "config.password zorunlu (restic depo şifresi)"

# Parola env ile (özel karakter güvenli). Test ile aynı stil: restic -r "$REPO".
export RESTIC_PASSWORD="$PASSWORD"

DAY="$(onx_json_field day '')"
TAG_ARG=()
[[ "$DAY" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && TAG_ARG=(--tag "$DAY")

onx_log "backup-push-restic: ${LOCAL_PATH} → restic ${REPO}"

OUT_FILE="$(mktemp /tmp/onx-restic-XXXXXX)"
trap 'rm -f "$OUT_FILE"' EXIT

# Depo yoksa başlat ('cat config' hafif varlık kontrolü; init mevcut depoyu bozmaz çünkü
# yalnız yokken çağrılır). Başlatma da başarısızsa net hata.
if ! restic -r "$REPO" cat config >/dev/null 2>"$OUT_FILE"; then
    restic -r "$REPO" init >>"$OUT_FILE" 2>&1 \
        || onx_die 3 "restic depo başlatılamadı (${REPO}): $(tail -c 400 "$OUT_FILE")"
fi

START_S=$(date +%s)

restic -r "$REPO" backup "${TAG_ARG[@]}" --json "$LOCAL_PATH" >"$OUT_FILE" 2>&1 \
    || onx_die 3 "restic backup başarısız: $(tail -c 500 "$OUT_FILE")"

END_S=$(date +%s)
DURATION=$(( END_S - START_S ))

# --json summary satırından snapshot_id. Bulunamazsa 'unknown' (yine de uploaded=true).
SNAP_ID="$(grep -o '"snapshot_id":"[a-f0-9]*"' "$OUT_FILE" | tail -1 | cut -d'"' -f4)"
[[ -z "$SNAP_ID" ]] && SNAP_ID="unknown"
BYTES=$(stat -c%s "$LOCAL_PATH" 2>/dev/null || echo 0)

onx_json_out uploaded true remote_path "restic:${SNAP_ID}" bytes "$BYTES" duration_seconds "$DURATION" snapshot_id "$SNAP_ID"
