#!/usr/bin/env bash

# ── Colors & styles ────────────────────────────────────────────────────────────
RESET="\e[0m"
BOLD="\e[1m"
DIM="\e[2m"

BLACK="\e[30m"
RED="\e[31m"
GREEN="\e[32m"
YELLOW="\e[33m"
BLUE="\e[34m"
MAGENTA="\e[35m"
CYAN="\e[36m"
WHITE="\e[37m"

BG_BLUE="\e[44m"
BG_BLACK="\e[40m"

# ── Helpers ────────────────────────────────────────────────────────────────────
banner() {
    echo -e ""
    echo -e "${BG_BLUE}${BOLD}${WHITE}  ██████╗  █████╗ ████████╗ █████╗ ███╗   ██╗ ██████╗ ██████╗ ███████╗███████╗  ${RESET}"
    echo -e "${BG_BLUE}${BOLD}${WHITE}  ██╔══██╗██╔══██╗╚══██╔══╝██╔══██╗████╗  ██║██╔═══██╗██╔══██╗██╔════╝██╔════╝  ${RESET}"
    echo -e "${BG_BLUE}${BOLD}${WHITE}  ██║  ██║███████║   ██║   ███████║██╔██╗ ██║██║   ██║██║  ██║█████╗  ███████╗  ${RESET}"
    echo -e "${BG_BLUE}${BOLD}${WHITE}  ██║  ██║██╔══██║   ██║   ██╔══██║██║╚██╗██║██║   ██║██║  ██║██╔══╝  ╚════██║  ${RESET}"
    echo -e "${BG_BLUE}${BOLD}${WHITE}  ██████╔╝██║  ██║   ██║   ██║  ██║██║ ╚████║╚██████╔╝██████╔╝███████╗███████║  ${RESET}"
    echo -e "${BG_BLUE}${BOLD}${WHITE}  ╚═════╝ ╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝╚═╝  ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝  ${RESET}"
    echo -e "${DIM}${CYAN}                         datanodes.to downloader${RESET}"
    echo -e ""
}

info()    { echo -e "${BOLD}${CYAN}  [•]${RESET} $*"; }
success() { echo -e "${BOLD}${GREEN}  [✔]${RESET} $*"; }
warn()    { echo -e "${BOLD}${YELLOW}  [!]${RESET} $*"; }
error()   { echo -e "${BOLD}${RED}  [✘]${RESET} $*"; }
step()    { echo -e "${BOLD}${MAGENTA}  [→]${RESET} $*"; }

hr() {
    echo -e "${DIM}${BLUE}  ──────────────────────────────────────────────────────────${RESET}"
}

get_size() {
    local f="$1"
    [[ -f "$f" ]] || { echo 0; return; }
    stat -c "%s" "$f" 2>/dev/null \
        || stat -f "%z" "$f" 2>/dev/null \
        || wc -c < "$f" 2>/dev/null \
        || echo 0
}

urldecode() {
    python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$1" 2>/dev/null \
        || printf '%b' "${1//%/\\x}"
}

human_size() {
    local bytes=$1
    if   (( bytes >= 1073741824 )); then awk "BEGIN{printf \"%.2f GB\", $bytes/1073741824}"
    elif (( bytes >= 1048576 ));    then awk "BEGIN{printf \"%.2f MB\", $bytes/1048576}"
    elif (( bytes >= 1024 ));       then awk "BEGIN{printf \"%.2f KB\", $bytes/1024}"
    else printf "%d B" "$bytes"
    fi
}

# ── CONFIG ─────────────────────────────────────────────────────────────────────
ID="hzp7pljy3aw7"
FILE_NAME="PPSA08330.rar"
# ──────────────────────────────────────────────────────────────────────────────

banner
hr
info  "File   : ${BOLD}${WHITE}${FILE_NAME}${RESET}"
info  "Node ID: ${BOLD}${WHITE}${ID}${RESET}"
hr

ATTEMPT=0

while true; do
    (( ATTEMPT++ ))
    echo -e ""
    step "Attempt ${BOLD}#${ATTEMPT}${RESET}"

    # ── Get current file size ──────────────────────────────────────────────────
    CURRENT_SIZE=$(get_size "$FILE_NAME")
    if [[ -f "$FILE_NAME" ]]; then
        info "Existing file found — $(human_size $CURRENT_SIZE)"
    else
        info "No existing file, starting fresh"
    fi

    # ── POST request for download URL ─────────────────────────────────────────
    info "Requesting download URL from datanodes.to..."

    RAW_JSON=$(curl -s -X POST "https://datanodes.to/download" -F "op=download2" -F "id=${ID}" -F "g_captch__a=1")
    RAW_URL=$(echo "$RAW_JSON" | grep -o '"url":"[^"]*"' | sed 's/"url":"//;s/"//')

    if [[ -z "$RAW_URL" ]]; then
        error "No URL in response: ${DIM}${RAW_JSON}${RESET}"
        warn  "Retrying in 60 seconds..."
        sleep 60
        continue
    fi

    DL_URL=$(urldecode "$RAW_URL")
    success "Got URL: ${DIM}${DL_URL:0:80}...${RESET}"
    hr

    # ── Download ───────────────────────────────────────────────────────────────
    step "Starting wget (resume enabled)..."
    echo -e ""
    wget -c --timeout=30 --read-timeout=60 --tries=1 "$DL_URL" -O "$FILE_NAME"
    echo -e ""
    hr

    # ── Compare sizes ──────────────────────────────────────────────────────────
    NEW_SIZE=$(get_size "$FILE_NAME")

    info "Size before : $(human_size $CURRENT_SIZE)  ${DIM}(${CURRENT_SIZE} bytes)${RESET}"
    info "Size after  : $(human_size $NEW_SIZE)  ${DIM}(${NEW_SIZE} bytes)${RESET}"

    if [[ "$NEW_SIZE" -ne "$CURRENT_SIZE" ]]; then
        warn "Size changed — server likely disconnected. Resuming..."
        sleep 2
        continue
    fi

    hr
    success "${BOLD}Download complete! Final size: $(human_size $NEW_SIZE)${RESET}"
    hr
    echo -e ""
    break
done
