#!/usr/bin/env bash
# onx-backup-push-google-drive — yedek dosyasını Google Drive'a yükle (rclone, OAuth)
#
# Input (stdin JSON):
#   {
#     "local_path": "/var/backups/onoxsoft/.../backup.tar.gz",
#     "destination_id": 7,
#     "config": {
#       "client_id":     "...apps.googleusercontent.com",
#       "client_secret": "...",
#       "refresh_token": "...",          # OAuth ile alınır (GoogleDriveOAuthController)
#       "folder_id":     "1AbC..."       # optional; boşsa Drive kökü
#     }
#   }
# Output (stdout JSON):
#   {"uploaded":true,"remote_path":"<filename>","bytes":N,"duration_seconds":N}
#
# rclone gerekli (Drive'ı native destekler). Kalıcı config dosyası yazılmaz —
# RCLONE_CONFIG_GDRIVE_* env değişkenleriyle ad-hoc remote. refresh_token + client
# verilince rclone access_token'ı kendisi tazeler.
#
# Deployed to: /usr/local/onoxsoft/bin/onx-backup-push-google-drive

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

require_root
onx_json_input

command -v rclone >/dev/null 2>&1 \
    || onx_die 2 "rclone kurulu değil — Google Drive yedeği için gerekli. Kurulum: curl https://rclone.org/install.sh | sudo bash"

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}"

CLIENT_ID="$(onx_json_get "$CONFIG" client_id '')"
CLIENT_SECRET="$(onx_json_get "$CONFIG" client_secret '')"
REFRESH_TOKEN="$(onx_json_get "$CONFIG" refresh_token '')"
FOLDER_ID="$(onx_json_get "$CONFIG" folder_id '')"

[[ -z "$CLIENT_ID" ]]     && onx_die 1 "config.client_id zorunlu (Ayarlar > Yedekleme)"
[[ -z "$CLIENT_SECRET" ]] && onx_die 1 "config.client_secret zorunlu (Ayarlar > Yedekleme)"
[[ -z "$REFRESH_TOKEN" ]] && onx_die 1 "config.refresh_token zorunlu (önce 'Drive'a Bağlan')"

# rclone token JSON — access_token boş + geçmiş expiry → ilk kullanımda refresh_token
# ile tazelenir. jq ile kurulur (refresh_token'da özel karakter olabilir).
TOKEN_JSON="$(jq -nc --arg rt "$REFRESH_TOKEN" \
    '{access_token:"",token_type:"Bearer",refresh_token:$rt,expiry:"2000-01-01T00:00:00Z"}')"

export RCLONE_CONFIG_GDRIVE_TYPE="drive"
export RCLONE_CONFIG_GDRIVE_SCOPE="drive"
export RCLONE_CONFIG_GDRIVE_CLIENT_ID="$CLIENT_ID"
export RCLONE_CONFIG_GDRIVE_CLIENT_SECRET="$CLIENT_SECRET"
export RCLONE_CONFIG_GDRIVE_TOKEN="$TOKEN_JSON"

# folder_id: gerçek Drive ID (uzun) → root_folder_id; aksi halde klasör ADI →
# rclone path (gdrive:Ad/), rclone yoksa OLUŞTURUR. Boşsa kök. (test ile aynı mantık.)
GD_DEST="gdrive:"
if [[ -n "$FOLDER_ID" ]]; then
    if [[ "$FOLDER_ID" =~ ^[A-Za-z0-9_-]{20,}$ ]]; then
        export RCLONE_CONFIG_GDRIVE_ROOT_FOLDER_ID="$FOLDER_ID"
    else
        GD_FOLDER="$(printf '%s' "$FOLDER_ID" | tr -cd 'A-Za-z0-9 ._-')"
        GD_DEST="gdrive:${GD_FOLDER}/"
    fi
fi

# Per-gün alt-klasör: PHP backup'ın created_at tarihini (YYYY-MM-DD) gönderir →
# yedekler tarih klasörlerine düzenlenir (gdrive:<klasör>/2026-06-02/<dosya>).
# rclone copy hedef klasörü otomatik oluşturur. Geçersiz/boş day → klasör eklenmez.
DAY="$(onx_json_field day '')"
REMOTE_SUBDIR=""
if [[ "$DAY" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
    GD_DEST="${GD_DEST}${DAY}/"
    REMOTE_SUBDIR="${DAY}/"
fi

FILENAME="$(basename "$LOCAL_PATH")"
onx_log "backup-push-google-drive: ${LOCAL_PATH} → ${GD_DEST}${FILENAME}"

START_S=$(date +%s)
OUT_FILE="$(mktemp /tmp/onx-rclone-gdrive-XXXXXX)"
trap 'rm -f "$OUT_FILE"' EXIT

rclone copy "$LOCAL_PATH" "$GD_DEST" --no-traverse --stats=0 >"$OUT_FILE" 2>&1 \
    || onx_die 3 "Drive upload başarısız: $(tail -c 500 "$OUT_FILE")"

END_S=$(date +%s)
DURATION=$(( END_S - START_S ))
BYTES=$(stat -c%s "$LOCAL_PATH" 2>/dev/null || echo 0)

onx_json_out uploaded true remote_path "${REMOTE_SUBDIR}${FILENAME}" bytes "$BYTES" duration_seconds "$DURATION"
