#!/bin/bash
# refresh-ingrammicro-catalog.sh
# Downloads PRICE.ZIP from Ingram Micro SFTP, extracts PRICE.TXT,
# and replaces the catalog CSV if the file has changed.
# Triggers a catalog reload via the products server API.

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"

# Load .env (only simple KEY=VALUE lines, skip multiline/complex values)
if [ -f "$PROJECT_DIR/.env" ]; then
    while IFS='=' read -r key value; do
        # Skip comments, blank lines, and lines without =
        [[ -z "$key" || "$key" =~ ^[[:space:]]*# ]] && continue
        # Only export IM_SFTP_* and MKL_PRODUCTS_PORT vars we need
        key=$(echo "$key" | xargs)
        case "$key" in
            IM_SFTP_*|IM_CATALOG_PATH|MKL_PRODUCTS_PORT)
                value=$(echo "$value" | xargs)
                export "$key=$value"
                ;;
        esac
    done < "$PROJECT_DIR/.env"
fi

SFTP_HOST="${IM_SFTP_HOST:-mercury.ingrammicro.com}"
SFTP_USER="${IM_SFTP_USER:-JK0523}"
SFTP_PORT="${IM_SFTP_PORT:-22}"
CATALOG_PATH="${IM_CATALOG_PATH:-$PROJECT_DIR/products/vendor-uploads/ingrammicro-catalog.csv}"
PRODUCTS_PORT="${MKL_PRODUCTS_PORT:-3002}"

WORK_DIR="/tmp/im-refresh-$$"
mkdir -p "$WORK_DIR"

cleanup() {
    rm -rf "$WORK_DIR"
}
trap cleanup EXIT

echo "[IM Refresh] $(date '+%Y-%m-%d %H:%M:%S') Starting Ingram Micro catalog refresh"

# IM_SFTP_PASS must be in env (from .env) — export for sshpass -e
export SSHPASS="$IM_SFTP_PASS"

# Download PRICE.ZIP via SFTP
echo "[IM Refresh] Downloading PRICE.ZIP from $SFTP_HOST..."
sshpass -e sftp -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -P "$SFTP_PORT" \
    "$SFTP_USER@$SFTP_HOST" <<EOF
get PRICE.ZIP $WORK_DIR/PRICE.ZIP
bye
EOF

if [ ! -f "$WORK_DIR/PRICE.ZIP" ]; then
    echo "[IM Refresh] ERROR: Failed to download PRICE.ZIP"
    exit 1
fi

ZIP_SIZE=$(stat -c %s "$WORK_DIR/PRICE.ZIP" 2>/dev/null || stat -f %z "$WORK_DIR/PRICE.ZIP")
echo "[IM Refresh] Downloaded PRICE.ZIP ($(( ZIP_SIZE / 1024 / 1024 ))MB)"

# Extract PRICE.TXT
unzip -o "$WORK_DIR/PRICE.ZIP" -d "$WORK_DIR" > /dev/null
if [ ! -f "$WORK_DIR/PRICE.TXT" ]; then
    echo "[IM Refresh] ERROR: PRICE.TXT not found in archive"
    exit 1
fi

NEW_LINES=$(wc -l < "$WORK_DIR/PRICE.TXT")
echo "[IM Refresh] Extracted PRICE.TXT ($NEW_LINES lines)"

# Compare with existing file — skip if identical
if [ -f "$CATALOG_PATH" ]; then
    EXISTING_MD5=$(md5sum "$CATALOG_PATH" 2>/dev/null | cut -d' ' -f1 || md5 -q "$CATALOG_PATH")
    NEW_MD5=$(md5sum "$WORK_DIR/PRICE.TXT" 2>/dev/null | cut -d' ' -f1 || md5 -q "$WORK_DIR/PRICE.TXT")
    if [ "$EXISTING_MD5" = "$NEW_MD5" ]; then
        echo "[IM Refresh] Catalog unchanged — skipping"
        exit 0
    fi
    OLD_LINES=$(wc -l < "$CATALOG_PATH")
    echo "[IM Refresh] Catalog changed: $OLD_LINES → $NEW_LINES lines"
fi

# Replace catalog file
cp "$WORK_DIR/PRICE.TXT" "$CATALOG_PATH"
echo "[IM Refresh] Updated $CATALOG_PATH"

# Trigger catalog reload on products server
echo "[IM Refresh] Triggering catalog reload..."
RELOAD_RESPONSE=$(curl -sf --max-time 120 "http://localhost:$PRODUCTS_PORT/ingram-micro-reload-catalog" 2>&1 || true)
if echo "$RELOAD_RESPONSE" | grep -qi "reloaded\|success"; then
    echo "[IM Refresh] Catalog reload triggered successfully"
else
    echo "[IM Refresh] Warning: Reload response: $RELOAD_RESPONSE"
    echo "[IM Refresh] Catalog file updated but reload may need manual trigger"
fi

echo "[IM Refresh] $(date '+%Y-%m-%d %H:%M:%S') Done"
