#!/usr/bin/env bash
# Push image-only updates to outbound channels after the normalization/priming
# one-time service has completed successfully.
#
# Typical systemd chaining:
#   plytixmage-onetime.service
#     OnSuccess=plytixmage-post-images.service
#
# Usage:
#   ./scripts/push_recent_images_after_normalize.sh
#   MAGENTO_CONNECTION_IDS="1 4" SHOPIFY_CONNECTION_IDS="7" ./scripts/push_recent_images_after_normalize.sh
#
# Env:
#   APP_ROOT                  PlytixMage root (default: script parent/..)
#   VENV_DIR                  Virtualenv directory (default: $APP_ROOT/.venv)
#   PYTHON                    Python interpreter override
#   LOG_DIR                   Log directory (default: $APP_ROOT/logs)
#   STATUS_FILE               Prior normalize status file to verify first
#                             (default: $LOG_DIR/normalize_prime_magento_latest.status)
#   REQUIRE_SUCCESS_STATUS    1 = require STATUS_FILE to begin with "ok:" (default: 1)
#   MAGENTO_CONNECTION_IDS    Space-separated Magento compat/native ids (default: "1 4")
#   SHOPIFY_CONNECTION_IDS    Space-separated Shopify compat/native ids (default: "")
#   IMAGE_PUSH_LIMIT          SKU limit for auto-selected images-only pushes (default: 10000)
#   IMAGE_PUSH_WAIT           1 = wait for Magento queue completion (default: 1)
#   IMAGE_PUSH_FORCE          1 = force Shopify image push (default: 1)

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP_ROOT="$(cd "${APP_ROOT:-$SCRIPT_DIR/..}" && pwd)"
VENV_DIR="${VENV_DIR:-$APP_ROOT/.venv}"
if [[ -z "${PYTHON:-}" ]]; then
  if [[ -x "$VENV_DIR/bin/python" ]]; then
    PYTHON="$VENV_DIR/bin/python"
  else
    PYTHON="python"
  fi
fi

LOG_DIR="${LOG_DIR:-$APP_ROOT/logs}"
STATUS_FILE="${STATUS_FILE:-$LOG_DIR/normalize_prime_magento_latest.status}"
REQUIRE_SUCCESS_STATUS="${REQUIRE_SUCCESS_STATUS:-1}"
MAGENTO_CONNECTION_IDS="${MAGENTO_CONNECTION_IDS:-1 4}"
SHOPIFY_CONNECTION_IDS="${SHOPIFY_CONNECTION_IDS:-}"
IMAGE_PUSH_LIMIT="${IMAGE_PUSH_LIMIT:-10000}"
IMAGE_PUSH_WAIT="${IMAGE_PUSH_WAIT:-1}"
IMAGE_PUSH_FORCE="${IMAGE_PUSH_FORCE:-1}"

mkdir -p "$LOG_DIR"
STAMP="$(date -u +%Y%m%dT%H%M%SZ)"
LOG_FILE="$LOG_DIR/post_normalize_image_push_${STAMP}.log"

cd "$APP_ROOT"
export PYTHONUNBUFFERED=1

exec > >(tee -a "$LOG_FILE") 2>&1

echo "=== post-normalize outbound image push ==="
echo "started_utc=$STAMP"
echo "app_root=$APP_ROOT"
echo "status_file=$STATUS_FILE"
echo "magento_connection_ids=$MAGENTO_CONNECTION_IDS"
echo "shopify_connection_ids=$SHOPIFY_CONNECTION_IDS"
echo "image_push_limit=$IMAGE_PUSH_LIMIT"
echo "image_push_wait=$IMAGE_PUSH_WAIT"
echo "image_push_force=$IMAGE_PUSH_FORCE"
echo "python=$PYTHON ($("$PYTHON" --version 2>&1 || true))"
echo "log_file=$LOG_FILE"
echo

fail() {
  local step="$1"
  local code="$2"
  echo "FAILED step=$step exit=$code"
  exit "$code"
}

run_step() {
  local name="$1"
  shift
  echo
  echo "------------------------------------------------------------"
  echo "STEP: $name"
  echo "CMD: $*"
  echo "started: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
  echo "------------------------------------------------------------"
  if "$@"; then
    echo "OK: $name ($(date -u +%Y-%m-%dT%H:%M:%SZ))"
  else
    local code=$?
    fail "$name" "$code"
  fi
}

if [[ "$REQUIRE_SUCCESS_STATUS" == "1" ]]; then
  if [[ ! -f "$STATUS_FILE" ]]; then
    echo "Refusing to run: missing status file $STATUS_FILE"
    exit 3
  fi
  STATUS_CONTENT="$(cat "$STATUS_FILE" 2>/dev/null || true)"
  if [[ "$STATUS_CONTENT" != ok:* ]]; then
    echo "Refusing to run: prior normalize status is not successful"
    echo "status_content=$STATUS_CONTENT"
    exit 4
  fi
fi

for connection_id in $MAGENTO_CONNECTION_IDS; do
  CMD=(
    "$PYTHON" -m app.jobs.push_channel_sample
    --channels magento
    --magento-connection-id "$connection_id"
    --images-only
    --limit "$IMAGE_PUSH_LIMIT"
    --no-dry-run
  )
  if [[ "$IMAGE_PUSH_WAIT" == "1" ]]; then
    CMD+=(--wait)
  fi
  run_step "push_magento_images_conn_${connection_id}" "${CMD[@]}"
done

for connection_id in $SHOPIFY_CONNECTION_IDS; do
  CMD=(
    "$PYTHON" -m app.jobs.shopify_push_images
    --connection-id "$connection_id"
    --limit "$IMAGE_PUSH_LIMIT"
    --no-dry-run
  )
  if [[ "$IMAGE_PUSH_FORCE" == "1" ]]; then
    CMD+=(--force)
  fi
  run_step "push_shopify_images_conn_${connection_id}" "${CMD[@]}"
done

echo
echo "=== completed successfully $(date -u +%Y-%m-%dT%H:%M:%SZ) ==="
echo "log_file=$LOG_FILE"
