#!/usr/bin/env bash
# Script to download monitoring exporter binaries that are too large for Git
# Usage: ./download-exporters.sh [target_dir]

set -euo pipefail

TARGET_DIR="${1:-$(dirname "$0")/export-bins}"
mkdir -p "$TARGET_DIR"

# Versions
VER_ALLOY="v1.16.0"
VER_NODE="v1.11.1"
VER_PHP_FPM="v2.2.0"
VER_PROCESS="v0.8.7"
VER_SQL="0.22.3"

# URLs
URL_ALLOY="https://github.com/grafana/alloy/releases/download/${VER_ALLOY}/alloy-linux-amd64.zip"
URL_NODE="https://github.com/prometheus/node_exporter/releases/download/${VER_NODE}/node_exporter-${VER_NODE#v}.linux-amd64.tar.gz"
URL_PHP_FPM="https://github.com/hipages/php-fpm_exporter/releases/download/${VER_PHP_FPM}/php-fpm_exporter_${VER_PHP_FPM#v}_linux_amd64.tar.gz"
URL_PROCESS="https://github.com/ncabatoff/process-exporter/releases/download/${VER_PROCESS}/process-exporter-${VER_PROCESS#v}.linux-amd64.tar.gz"
URL_SQL="https://github.com/burningalchemist/sql_exporter/releases/download/${VER_SQL}/sql_exporter-${VER_SQL}.linux-amd64.tar.gz"

download_and_extract() {
    local url="$1"
    local name="$2"
    local target_file="$3"
    local strip_components="${4:-0}"
    local member="${5:-}"

    if [[ -f "$target_file" ]]; then
        echo "Check: $name already exists at $target_file. Skipping."
        return
    fi

    echo "Downloading $name..."
    local tmp_file
    tmp_file=$(mktemp)

    if ! curl -L -s -f "$url" -o "$tmp_file"; then
        echo "Error: Failed to download $name from $url"
        rm -f "$tmp_file"
        return 1
    fi

    case "$url" in
        *.zip)
            echo "Extracting zip..."
            # For zip, we might need to extract a specific file or move it
            local tmp_dir
            tmp_dir=$(mktemp -d)
            unzip -q "$tmp_file" -d "$tmp_dir"

            if [[ -n "$member" ]]; then
                mv "$tmp_dir/$member" "$target_file"
            else
                # Guess first file if no member specified (not ideal)
                mv "$tmp_dir"/* "$target_file"
            fi
            rm -rf "$tmp_dir"
            ;;
        *.tar.gz)
            echo "Extracting tar.gz..."
            if [[ -n "$member" ]]; then
                tar -xzf "$tmp_file" -C "$(dirname "$target_file")" --strip-components="$strip_components" "$member"
            else
                tar -xzf "$tmp_file" -C "$(dirname "$target_file")" --strip-components="$strip_components"
            fi
            ;;
    esac

    chmod +x "$target_file"
    rm -f "$tmp_file"
    echo "Success: $name installed to $target_file"
}

# 1. Alloy
download_and_extract "$URL_ALLOY" "Alloy" "$TARGET_DIR/alloy" 0 "alloy-linux-amd64"

# 2. Node Exporter
download_and_extract "$URL_NODE" "Node Exporter" "$TARGET_DIR/node_exporter" 1 "node_exporter-${VER_NODE#v}.linux-amd64/node_exporter"

# 3. PHP-FPM Exporter
download_and_extract "$URL_PHP_FPM" "PHP-FPM Exporter" "$TARGET_DIR/php-fpm_exporter" 0 "php-fpm_exporter"

# 4. Process Exporter
download_and_extract "$URL_PROCESS" "Process Exporter" "$TARGET_DIR/process-exporter" 1 "process-exporter-${VER_PROCESS#v}.linux-amd64/process-exporter"

# 5. SQL Exporter (Note: Promtail is not needed - Alloy handles log collection)
mkdir -p "$TARGET_DIR/sql_exporter/bin"
download_and_extract "$URL_SQL" "SQL Exporter" "$TARGET_DIR/sql_exporter/bin/sql_exporter" 1 "sql_exporter-${VER_SQL}.linux-amd64/sql_exporter"

echo "All exporters processed."
