#!/usr/bin/env bash
# onx-cpanel-pull-remote — Uzak WHM'de pkgacct çalıştır + cpmove arşivini indir.
#
# Input (stdin JSON):
#   {host, port, login_user, auth_method:"password", password,
#    source_username:"acme", backup_script:"/scripts/pkgacct",
#    output_dir:"/opt/onoxsoft/storage/app/migrations"}
# Output (stdout JSON): {local_path:".../cpmove-acme.tar.gz", tar_size_bytes:N}
#
# exit: 0=ok 1=bad input 2=preflight 3=exec(pull/pkgacct) hatası
# Deployed to: /usr/local/onoxsoft/bin/onx-cpanel-pull-remote

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

require_root
onx_json_input
onx_ssh_remote_init

SRC_USER=$(onx_json_field source_username)
BACKUP_SCRIPT=$(onx_json_field backup_script "/scripts/pkgacct")
OUTPUT_DIR=$(onx_json_field output_dir)

# source_username uzaktaki komuta giriyor → katı doğrula (injection guard).
[[ "$SRC_USER" =~ ^[a-z0-9_-]+$ ]] || onx_die 1 "geçersiz source_username: ${SRC_USER}"
# backup_script registry'den gelir (sabit); yine de güvenli karakter seti.
[[ "$BACKUP_SCRIPT" =~ ^[a-zA-Z0-9_/.-]+$ ]] || onx_die 1 "geçersiz backup_script"
[[ -n "$OUTPUT_DIR" ]] || onx_die 1 "output_dir zorunlu"

mkdir -p "$OUTPUT_DIR" || onx_die 3 "output_dir oluşturulamadı: ${OUTPUT_DIR}"
# Dizini panel (web/queue) kullanıcısına eşitle — restore'un in-process tar'ı apache
# olarak çalışır; root-owned 0700 dizini traverse edemez / dosyayı okuyamaz ("Permission
# denied"). storage/app zaten panel kullanıcısına ait → onun owner:group'unu devral.
chown --reference="$(dirname "$OUTPUT_DIR")" "$OUTPUT_DIR" 2>/dev/null || true
chmod 0750 "$OUTPUT_DIR" 2>/dev/null || true

REMOTE_ARCHIVE="/home/cpmove-${SRC_USER}.tar.gz"
LOCAL_PATH="${OUTPUT_DIR%/}/cpmove-${SRC_USER}.tar.gz"
[[ -e "$LOCAL_PATH" ]] && onx_die 2 "hedef dosya zaten var: ${LOCAL_PATH}"

onx_log "cpanel-pull-remote: ${ONX_SSH_USER}@${ONX_SSH_HOST} pkgacct ${SRC_USER}"

if [[ "${MOCK_MODE}" != "1" ]]; then
    # pkgacct uzakta — büyük hesaplarda dakikalar sürebilir (sysapi timeout 3600).
    onx_ssh_run "${BACKUP_SCRIPT} ${SRC_USER}" >/dev/null

    # Arşiv oluştu mu? (test -f always-0 ifade → onx_ssh_run die etmez, çıktıyı grep'leriz)
    onx_ssh_run "test -f ${REMOTE_ARCHIVE} && echo OK || echo MISSING" | grep -q OK \
        || onx_die 3 "pkgacct arşivi uzakta bulunamadı: ${REMOTE_ARCHIVE} (pkgacct başarısız olabilir)"
fi

onx_ssh_pull "$REMOTE_ARCHIVE" "$LOCAL_PATH"

# Uzaktaki cpmove'u temizle (best-effort — disk şişmesin).
[[ "${MOCK_MODE}" != "1" ]] && onx_ssh_try "rm -f ${REMOTE_ARCHIVE}" >/dev/null 2>&1 || true

# Dosyayı da panel kullanıcısına eşitle (owner okur; 0600 → grup/diğer okuyamaz, güvenli).
chown --reference="$(dirname "$OUTPUT_DIR")" "$LOCAL_PATH" 2>/dev/null || true
chmod 0600 "$LOCAL_PATH" 2>/dev/null || true
SIZE=$(stat -c%s "$LOCAL_PATH" 2>/dev/null || echo 0)
if [[ "${MOCK_MODE}" != "1" && "${SIZE}" -le 0 ]]; then
    onx_die 3 "indirilen arşiv boş: ${LOCAL_PATH}"
fi

onx_audit "onx-migration" "cpanel-pull host=${ONX_SSH_HOST} user=${SRC_USER} -> ${LOCAL_PATH} bytes=${SIZE}"
onx_json_out local_path "$LOCAL_PATH" tar_size_bytes "$SIZE"
