#!/usr/bin/env bash
# onx-archive-create — Dosya/klasörleri arşivle (zip veya tar.gz)
# Input:  {"paths":["/home/onx_xxx/public_html"],"archive_name":"backup","format":"zip"}
# Output: {"archive":"/home/onx_xxx/backup.zip","size":12345}

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

require_root
onx_json_input

# ─── Parse input ─────────────────────────────────────────────────────────────
ARCHIVE_NAME="$(onx_json_field archive_name)"
FORMAT="$(onx_json_field format 'zip')"
PATHS_JSON="$(printf '%s' "$INPUT" | jq -c '.paths // []')"

[[ -z "$ARCHIVE_NAME" ]] && onx_die 1 "archive_name zorunlu"
[[ "$FORMAT" =~ ^(zip|tar\.gz)$ ]] || onx_die 1 "Geçersiz format: '${FORMAT}' (zip veya tar.gz bekleniyor)"

# Strip any path separators from archive name to prevent traversal
ARCHIVE_NAME="$(basename "$ARCHIVE_NAME")"
[[ -z "$ARCHIVE_NAME" ]] && onx_die 1 "Geçersiz archive_name"

# ─── Validate paths ───────────────────────────────────────────────────────────
mapfile -t PATHS < <(printf '%s' "$PATHS_JSON" | jq -r '.[]')

[[ ${#PATHS[@]} -eq 0 ]] && onx_die 1 "paths dizisi boş"

declare -a VALIDATED_PATHS=()
FIRST_PATH=""

for p in "${PATHS[@]}"; do
    # Resolve real path and ensure it lives under /home/
    real="$(realpath -e "$p" 2>/dev/null)" || onx_die 1 "Path çözümlenemedi: $p"
    [[ "$real" == /home/* ]] || onx_die 1 "Path /home/ dışında: $real"
    VALIDATED_PATHS+=("$real")
    [[ -z "$FIRST_PATH" ]] && FIRST_PATH="$real"
done

# Archive goes into the same directory as the first item
ARCHIVE_DIR="$(dirname "$FIRST_PATH")"

# ─── Create archive ───────────────────────────────────────────────────────────
if [[ "$FORMAT" == "zip" ]]; then
    require_cmd zip
    ARCHIVE_FILE="${ARCHIVE_DIR}/${ARCHIVE_NAME}.zip"
    zip -r "$ARCHIVE_FILE" "${VALIDATED_PATHS[@]}" \
        || onx_die 3 "zip başarısız"
else
    require_cmd tar
    ARCHIVE_FILE="${ARCHIVE_DIR}/${ARCHIVE_NAME}.tar.gz"
    tar -czf "$ARCHIVE_FILE" "${VALIDATED_PATHS[@]}" \
        || onx_die 3 "tar başarısız"
fi

SIZE="$(stat -c '%s' "$ARCHIVE_FILE" 2>/dev/null || echo 0)"

onx_log "archive-create: archive=${ARCHIVE_FILE} size=${SIZE}"
onx_json_out archive "$ARCHIVE_FILE" size "$SIZE"
