#!/usr/bin/env bash
# onx-directadmin-pull-remote — Uzak DA'da admin_backup_user.sh çalıştır + .tar.zst indir.
#
# DA backup: /usr/local/directadmin/scripts/admin_backup_user.sh <creator> <user>
# → <user>.tar.zst (veya .tar.gz) üretir; admin'in backup ayarına göre genelde
# /home/<creator>/admin_backups/ altında. creator user.conf'tan okunur.
#
# Input (stdin JSON):
#   {host, port, login_user, auth_method:"password", password,
#    source_username:"alarabalikcilik",
#    backup_script:"/usr/local/directadmin/scripts/admin_backup_user.sh",
#    output_dir:"/opt/onoxsoft/storage/app/migrations"}
# Output (stdout JSON): {local_path:".../alarabalikcilik.tar.zst", tar_size_bytes:N}
#
# exit: 0=ok 1=bad input 2=preflight 3=exec(backup/pull) hatası
# Deployed to: /usr/local/onoxsoft/bin/onx-directadmin-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 "/usr/local/directadmin/scripts/admin_backup_user.sh")
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" =~ ^[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 — ingest manifest okuması + restore
# için (root-owned 0700 olursa non-root worker okuyamaz).
chown --reference="$(dirname "$OUTPUT_DIR")" "$OUTPUT_DIR" 2>/dev/null || true
chmod 0750 "$OUTPUT_DIR" 2>/dev/null || true

if [[ "${MOCK_MODE}" == "1" ]]; then
    LOCAL_PATH="${OUTPUT_DIR%/}/${SRC_USER}.tar.zst"
    printf 'MOCK\n' > "$LOCAL_PATH"
    onx_json_out local_path "$LOCAL_PATH" tar_size_bytes "5"
    exit 0
fi

# Uzak DA'da kullanıcı gerçekten var mı? (yoksa creator=admin'e düşüp anlamsız
# backup çalıştırmasın — net hata ver; hakem MINOR.)
USEROK=$(onx_ssh_run "test -d /usr/local/directadmin/data/users/${SRC_USER} && echo YES || echo NO" | tr -d '\r\n')
[[ "$USEROK" == "YES" ]] || onx_die 3 "Uzak DirectAdmin'de kullanıcı bulunamadı: ${SRC_USER}"

# creator (admin_backup_user.sh <creator> <user> bekler) — user.conf'tan.
CREATOR=$(onx_ssh_run "grep '^creator=' /usr/local/directadmin/data/users/${SRC_USER}/user.conf 2>/dev/null | head -1 | cut -d= -f2" | tr -d '\r\n')
[[ -n "$CREATOR" ]] || CREATOR="admin"
[[ "$CREATOR" =~ ^[a-z0-9_-]+$ ]] || onx_die 1 "geçersiz creator: ${CREATOR}"

onx_log "directadmin-pull-remote: ${ONX_SSH_USER}@${ONX_SSH_HOST} admin_backup_user ${CREATOR} ${SRC_USER}"

# DA backup tetikle + ASYNC sonucu POLL'le.
#   - Legacy admin_backup_user.sh VARSA onu çalıştır (eski DA).
#   - YOKSA (modern DA 1.6+, nitrosistem 1.671): task.queue'ya admin backup task'ı ekle +
#     (KRİTİK: backup'lanacak kullanıcılar select0=,select1=... ile verilir; 'users=' anahtarı
#     DA tarafından SESSİZCE yok sayılır → task işlenir ama backup ÜRETİLMEZ — 1.671'de görüldü) +
#     dataskq tetikle. Backup async → MARK'tan YENİ + STABİL (boyut değişmiyor) + >1KB
#     user.admin.<user>.tar.zst dosyasını ~24 dk poll'le. Çıktı (DA 1.671 GERÇEK, dataskq
#     debug'ından): /home/admin/admin_backups/<user>/user.admin.<user>.tar.zst (ALT-DİZİN!).
#     Legacy düz <user>.tar.zst de aranır. SRC_USER/CREATOR katı doğrulandı; $/globlar UZAKTA expand.
REMOTE_CMD="M=\$(date +%s); if [ -x ${BACKUP_SCRIPT} ]; then ${BACKUP_SCRIPT} ${CREATOR} ${SRC_USER} >/dev/null 2>&1; else echo 'action=backup&owner=admin&type=admin&value=multiple&when=now&where=local&local_path=/home/admin/admin_backups&email=no&select0=${SRC_USER}' >> /usr/local/directadmin/data/task.queue; /usr/local/directadmin/dataskq d2000 >/dev/null 2>&1; fi; F=''; for i in \$(seq 1 180); do F=\$(find /home/admin/admin_backups /home/${SRC_USER}/backups -maxdepth 3 \\( -name 'user.*.${SRC_USER}.tar.zst' -o -name 'user.*.${SRC_USER}.tar.gz' -o -name '${SRC_USER}.tar.zst' -o -name '${SRC_USER}.tar.gz' \\) -newermt \"@\$((M-5))\" 2>/dev/null | head -1); if [ -n \"\$F\" ]; then s1=\$(stat -c%s \"\$F\" 2>/dev/null || echo 0); sleep 3; s2=\$(stat -c%s \"\$F\" 2>/dev/null || echo 0); if [ \"\$s1\" = \"\$s2\" ] && [ \"\$s1\" -gt 1000 ]; then break; fi; fi; sleep 5; done; printf 'PATH=%s\\n' \"\$F\""
RESULT=$(onx_ssh_run "$REMOTE_CMD")
REMOTE_FOUND=$(printf '%s' "$RESULT" | grep '^PATH=' | head -1 | cut -d= -f2- | tr -d '\r\n')
RC="task-queue"

# Bulunamadıysa: uzaktan TANI topla (backup aracı/sürüm/dizinler) + hataya göm →
# böylece bir sonraki denemenin hatası bize DA backup mekanizmasını gösterir.
if [[ -z "$REMOTE_FOUND" ]]; then
    DIAG=$(onx_ssh_try 'echo VER:; /usr/local/directadmin/directadmin v 2>/dev/null | head -1; echo ERRQ:; tail -6 /var/log/directadmin/errortaskq.log 2>/dev/null; echo DIRS:; ls -d /home/*/admin_backups /home/*/backups 2>/dev/null' 2>/dev/null | tr '\n' '|' | tr -d '\r' | head -c 700)
    onx_die 3 "DA yedeği oluşturulamadı (creator=${CREATOR} user=${SRC_USER} RC=${RC:-?}). TANI: ${DIAG}"
fi

EXT="tar.zst"
[[ "$REMOTE_FOUND" == *.tar.gz ]] && EXT="tar.gz"
LOCAL_PATH="${OUTPUT_DIR%/}/${SRC_USER}.${EXT}"
[[ -e "$LOCAL_PATH" ]] && onx_die 2 "hedef dosya zaten var: ${LOCAL_PATH}"

onx_ssh_pull "$REMOTE_FOUND" "$LOCAL_PATH"

# Uzaktaki backup'ı temizle (best-effort — disk şişmesin).
onx_ssh_try "d=\$(dirname '${REMOTE_FOUND}'); if [ \"\$(basename \"\$d\")\" = '${SRC_USER}' ]; then rm -rf \"\$d\"; else rm -f '${REMOTE_FOUND}'; fi" >/dev/null 2>&1 || true

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)
[[ "${SIZE}" -le 0 ]] && onx_die 3 "indirilen arşiv boş: ${LOCAL_PATH}"

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